[英]How to properly join tables with a many to one relationship
我有六张桌子
Orders
是一个加密表,其中包含客户已下达的订单。 Orders
表的哈希表。 OrdersHash
。 其余四个表是都具有相同结构的存储表。 StoreA, StoreB, StoreC, & StoreD
。
订单表
orderId | 其他行...
订单哈希表
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
返回同一行。
预先感谢您的帮助。
看来您可能想要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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.