我有六个桌子
Orders
是一个加密表,其中包含客户已下达的订单。Orders
表的哈希表。 OrdersHash
。其余四个表是都具有相同结构的存储表。 StoreA, StoreB, StoreC, & StoreD
。
订单表
orderId |该行的其余部分...
OrdersHash Table
orderId | orderIdHash |该行的其余部分。
四个存储表都共享此结构。
orderIdHash | customerId |该行的其余部分。
仅使用customerId
,我试图查询四个存储表,以查看是否有任何存储表包含customerId
。如果在四个商店表中的任何一个表上都找到了customerId
,我想使用orderIdHash
将我带回到原始的Orders
表中,并返回找到的所有订单的行。
如果我使用Mike的customerId,我希望订单表中的第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
的同一行表。
预先感谢您的帮助。
答案 0 :(得分:1)
似乎您可能想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