我有六张桌子
Orders
是一个包含客户已下订单的加密表。Orders
表。OrdersHash
.剩下的四个表都是存储表,它们都具有相同的结构。StoreA, StoreB, StoreC, & StoreD
.
订单表
订单编号 | 其余行...
订单哈希表
订单编号 | orderIdHash | 其余行..
四个存储表都共享此结构。
orderIdHash | 客户 ID | 其余行..
仅使用customerId
我试图查询四个存储表以查看是否有任何存储表包含customerId
. 如果在customerId
四个商店表中的任何一个中找到 ,我想使用orderIdHash
使我回到原始Orders
表并返回找到的任何订单的行。
如果我为 Mike 使用 customerId,我希望 Orders 表中的第 1 行。
这是我到目前为止所尝试的。
"SELECT
o.dateShipped AS orderShipped,
o.shipped AS shipped,
o.recieved AS recieved
FROM Orders o
JOIN OrdersHash oHash
ON o.orderId = oHash.orderId
JOIN StoreA a
ON ohash.orderIdHash = a.orderIdHash
JOIN StoreB b
ON ohash.orderIdHash = b.orderIdHash
JOIN StoreC c
ON ohash.orderIdHash = c.orderIdHash
JOIN StoreD d
ON ohash.orderIdHash = d.orderIdHash
WHERE
a.customerId = :customerId1
OR b.customerId = :customerId2
OR c.customerId = :customerId3
OR d.customerId = :customerId4";
**customerId 1,2,3,4 都是相同的值。我必须在 PDO 中使用不同的名称进行绑定。
这将返回一个结果,但当我只需要表中的一条记录时,它似乎为Orders
商店中的每一行返回相同的行并具有匹配项。orderIdHash
Orders
预先感谢您的帮助。
似乎您可能想要UNION
存储结果,然后将其存储JOIN
到Orders
表格中。通过使用UNION
而不是UNION ALL
,我们可以只选择不同的orderIdHash
值,确保Order
在结果表中每个值只得到一行。像这样的东西:
SELECT o.dateShipped AS orderShipped,
o.shipped AS shipped,
o.recieved AS recieved
FROM (SELECT customerId, orderIdHash
FROM (SELECT customerId, orderIdHash FROM StoreA
UNION
SELECT customerId, orderIdHash FROM StoreB
UNION
SELECT customerId, orderIdHash FROM StoreC
UNION
SELECT customerId, orderIdHash FROM StoreD
) stores
WHERE customerId = :customerId) c
JOIN OrdersHash oHash ON oHash.orderIdHash = c.orderIdHash
JOIN Orders o ON o.orderId = oHash.orderId
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句