Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从JOIN中的MySQL查询中排除结果_Php_Mysql - Fatal编程技术网

Php 从JOIN中的MySQL查询中排除结果

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

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

所以,我的桌子看起来像:

订单表(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       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固定的。谢谢