为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
心有法竹 2021-04-27 13:09:25
我有六张桌子主表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
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

看来您可能想要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


查看完整回答
反对 回复 2021-05-07
  • 1 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信