首页 > 解决方案 > 如何正确连接具有多对一关系的表

问题描述

我有六张桌子

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

在此处输入图像描述

如果我为 Mike 使用 customerId,我会期望 Orders 表中的第 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

预先感谢您的帮助。

标签: phpmysqlpdo

解决方案


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

推荐阅读