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

时间:2019-04-20 07:06:07

标签: php mysql pdo

我有六个桌子

  • 主表Orders是一个加密表,其中包含客户已下达的订单。
  • 第二个表是Orders表的哈希表。 OrdersHash
  • 其余四个表是都具有相同结构的存储表。 StoreA, StoreB, StoreC, & StoreD

    订单表

    orderId |该行的其余部分...

    OrdersHash Table

    orderId | orderIdHash |该行的其余部分。

    四个存储表都共享此结构。

    orderIdHash | customerId |该行的其余部分。

仅使用customerId,我试图查询四个存储表,以查看是否有任何存储表包含customerId。如果在四个商店表中的任何一个表上都找到了customerId,我想使用orderIdHash将我带回到原始的Orders表中,并返回找到的所有订单的行。

enter image description here

如果我使用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的同一行表。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

似乎您可能想UNION存储结果,然后JOINOrders表。通过使用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