繁体   English   中英

如何正确地以多对一关系联接表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM