【问题标题】:How to properly join tables with a many to one relationship如何正确连接具有多对一关系的表
【发布时间】:2019-04-20 07:06:06
【问题描述】:

我有六张桌子

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

    订单表

    订单ID |其余行...

    订单哈希表

    订单ID | orderIdHash |行的其余部分..

    四个存储表都共享这种结构。

    orderIdHash |客户 ID |行的其余部分..

仅使用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 表中的一条记录时,它似乎从 Orders 为商店中具有匹配 orderIdHash 的每一行返回同一行。

提前感谢您的帮助。

【问题讨论】:

  • 只是一个想法 - 但如果所有绑定都是相同的值,为什么不直接使用 b.customerId = a.customerId 等替换它。
  • 不错的主意,当我弄明白问题的关键时,我会看看那个。
  • 为什么你有多个存储表,如果存储 ID 将其链接到具有特定详细信息的存储表,通常你会有 1 个表和某种形式。
  • 四家供应商四张桌子..这是我被赋予的工作。
  • 每个订单是否包含 1 行? ordershash 每个订单是否包含 1 行?一个订单可以由多家商店履行吗?样本数据将有助于澄清,

标签: php mysql pdo


【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 2017-09-05
  • 1970-01-01
  • 2022-09-23
  • 2016-11-10
  • 1970-01-01
  • 2020-09-27
  • 2014-01-22
相关资源
最近更新 更多