猿问

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

我有六张桌子

  • 主表Orders是一个加密表,其中包含客户已下的订单。

  • 第二个表是该表的哈希Orders表。OrdersHash

  • 其余四个表是都具有相同结构的存储表。StoreA, StoreB, StoreC, & StoreD

    订单表

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

    订单哈希表

    orderId | orderIdHash | 其余的行..

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

    orderIdHash | customerId | 其余的行..

customerId我仅使用I来查询四个存储表,以查看是否有任何存储表包含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存储中的每一行返回了具有匹配项的同一行。orderIdHashOrders


心有法竹
浏览 160回答 1
1回答

一只萌萌小番薯

看来您可能想要UNION存储结果,然后再将其存储JOIN到Orders表中。通过使用UNION而不是UNION ALL,我们只能选择不同的orderIdHash值,从而确保Order结果表中的每一行仅获得一行。像这样的东西:SELECT o.dateShipped       AS orderShipped,       o.shipped           AS shipped,       o.recieved          AS recievedFROM (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) cJOIN OrdersHash oHash ON oHash.orderIdHash = c.orderIdHashJOIN Orders o ON o.orderId = oHash.orderId
随时随地看视频慕课网APP
我要回答