Php 从JOIN中的MySQL查询中排除结果
我有多个包含订单和交货的表,我只想获得未结订单(只有那些在交货表中没有记录的订单) 所以,我的桌子看起来像: 订单表(sh_comenzi): 订单行表(sh_comenzi_pos),其中,Php 从JOIN中的MySQL查询中排除结果,php,mysql,Php,Mysql,我有多个包含订单和交货的表,我只想获得未结订单(只有那些在交货表中没有记录的订单) 所以,我的桌子看起来像: 订单表(sh_comenzi): 订单行表(sh_comenzi_pos),其中,idc是sh_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
idc
是sh_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_交货项目)
期望的结果应该给我一个未结订单的输出,如下所示:
id partner
1 Partner X
2 Partner Y
4 Partner Q
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
结果不必跟踪数量,只需在线水平。如果订单中的一行存在于sh_delivery_items
中,则该行关闭
我试过这样的方法:
id partner
1 Partner X
2 Partner Y
4 Partner Q
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\u pos
)组合在一起。内部连接将省略空订单(如果有);如果需要,请使用左连接
接下来,使用一对列(idc
,CPO
)将每一行(订单、行项目)与交货信息(表sh_交货项目
)组合。LEFT JOIN
确保左侧表(或结果集)中的所有行都出现在最终结果集中;如果找不到右侧表中与左侧表中的行相匹配的行,则使用一个满NULL
s的行。这发生在尚未交付的行项目上(在sh_delivery_items
中没有记录)
然后,WHERE
子句只保留di
表中具有NULL
s的行(sh_delivery_items
),即未交付的行项目以及拥有它们的订单
最后,selectdistinct c.*
仅从orders表(sh_comenzi
)中选择列,DISTINCT
确保每个订单只显示一次。否则,每个订单对其未交付的行项目显示一次
使用所需的ORDER BY
子句自己完成查询。上海科门齐pos
和上海科门齐pos项目之间的关系如何?上海科门齐pos的“idc”代表上海科门齐pos的idc,cPosright也是一样,但是sh_delivery_items
表应该与sh_comenzi_pos
有直接关系,以了解订单是否已关闭。“sh_delivery_items”表保留所有已关闭的订单行,因此如果该表中存在来自sh_comenzi_pos的一行,则该行关闭。我正在试图找出如何找到所有仍有未结订单的订单。SHU交货项目是错误的。如果它必须包含行,那么它应该像table(id,id\u line)
一样,以获得哪些行是关闭的,请继续!有一个输入错误:内部连接的ON
子句中是p。idc@Phate01固定的。谢谢