gpt4 book ai didi

php - 在 JOIN 中排除 MySQL 查询的结果

转载 作者:行者123 更新时间:2023-11-29 07:40:25 24 4
gpt4 key购买 nike

我有多个包含订单和交货的表,我只想获取未结订单(仅那些在交货表中没有记录的订单)。

所以,我的表格看起来像:

订单表(sh_comenzi):

id  partner
1 Partner X
2 Partner Y
3 Partner Z
4 Partner Q

订单行表 (sh_comenzi_pos),其中 idcsh_comenzi 表的 id

id  idc cPos    quantity
1 1 1 5
2 1 2 10
3 1 3 20
4 2 1 10
5 2 2 15
6 3 1 10
7 3 2 5
8 3 3 8
9 4 1 15

交货项目表为 (sh_delivery_items)

id  idc cPos
1 1 1
2 1 3
3 2 2
4 3 1
5 3 2
6 3 3

期望的结果应该给我一个未结订单的输出,如下所示:

id  partner
1 Partner X
2 Partner Y
4 Partner Q

结果不必跟踪数量,只需跟踪行级别。如果 sh_delivery_items 中存在订单中的一行,则该行将被关闭。

我尝试过这样的事情:

SELECT DISTINCT sh_comenzi.id, partner FROM sh_comenzi
LEFT JOIN sh_comenzi_pos ON sh_comenzi.id = sh_comenzi_pos.idc
LEFT JOIN sh_delivery_items ON (sh_comenzi_pos.idc = sh_delivery_items.idc AND sh_comenzi_pos.cPos = sh_delivery_items.cPos)
WHERE sh_comenzi.id IS NOT NULL
ORDER BY sh_comenzi.id DESC

有人可以帮助我吗?

最佳答案

这是您需要的查询:

SELECT DISTINCT c.*
FROM sh_comenzi c
INNER JOIN sh_comenzi_pos p
ON c.id = p.idc
LEFT JOIN sh_delivery_items di # 'di' from 'delivery items'
ON p.idc = di.idc AND p.cPos = di.cPos
WHERE di.id IS NULL # keep only not-delivered items

它是如何工作的

它将所有订单(表sh_comenzi)与其行项目(表sh_comenzi_pos)结合起来。 INNER JOIN 将忽略空订单(如果有);如果您需要它们,请改用LEFT JOIN

接下来,使用一对列 (idc, cPos)。 LEFT JOIN 确保左侧表(或结果集)中的所有行都出现在最终结果集中;如果无法找到右侧表中的行与左侧表中的行匹配,则使用充满 NULL 的行。对于尚未转换的订单项,会发生这种情况(sh_delivery_items 中没有这些订单项的记录)。

然后,WHERE 子句仅保留 di 表中具有 NULL 的行 (sh_delivery_items) ,即未交付的订单项以及拥有它们的订单。

最后,SELECT DISTINCT c.* 仅选择订单表 (sh_comenzi) 中的列,并且 DISTINCT 确保每个订单仅出现一次。否则,每个订单的每个未转换订单项都会显示一次。

使用所需的 ORDER BY 子句自行完成查询。

关于php - 在 JOIN 中排除 MySQL 查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29250495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com