php - 如何正确连接具有多对一关系的表
问题描述
我有六张桌子
- 主表
Orders
是一个包含客户订单的加密表。 - 第二个表是该表的哈希
Orders
表。OrdersHash
. 剩下的四个表是存储表,它们都具有相同的结构。
StoreA, StoreB, StoreC, & StoreD
.订单表
订单号 | 其余的行...
订单哈希表
订单号 | 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
商店中的每一行返回相同的行,并且匹配。orderIdHash
Orders
预先感谢您的帮助。
解决方案
看来您可能想要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
推荐阅读
- azure - 如何获取没有备用电子邮件地址的用户 Azure AD
- python - 用于分割的 Python 图像类型、形状和通道
- python - 如何使用 Python 将 2 个变量添加到 plt.title
- javascript - 错误 404:使用 Axios 和 Netifly 发布请求
- regex - 使用 RegEx 检查空格
- java - JavaFX 修复“透视”三角形网格
- python - 如何根据 pandas 中的现有列创建新列?
- sql - 将数组取消嵌套到表 Postgres
- javascript - 从会议数据生成器登录第三方会议应用程序后如何刷新根卡?
- python - 如何首先使用第一列按升序对二维列表进行排序,然后在 python 中按降序对第二列进行排序?