在JOIN中排除MySQL查询的结果

时间:2015-03-25 08:16:20

标签: php mysql

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

所以,我的表看起来像:

订单表(sh_comenzi):

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

订单行表(sh_comenzi_pos)其中idcid表的sh_comenzi

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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

这是您需要的查询:

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

接下来,使用一对列(sh_delivery_itemsidc)将每一行(订单,订单项)与投放信息(表cPos)合并。 LEFT JOIN确保左侧表(或结果集)中的所有行都出现在最终结果集中;如果找不到右侧表格中的一行与左侧的行匹配,则会使用一整行NULL s。对于尚未发送的订单项会发生这种情况(sh_delivery_items中没有记录)。

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

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

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