我有多个包含订单和交货的表格,我想只获得未结订单(只有那些在交货表中没有记录的订单)。
所以,我的表看起来像:
订单表(sh_comenzi):
id partner
1 Partner X
2 Partner Y
3 Partner Z
4 Partner Q
订单行表(sh_comenzi_pos)其中idc
是id
表的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
有人可以帮助我吗?
答案 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_items
,idc
)将每一行(订单,订单项)与投放信息(表cPos
)合并。 LEFT JOIN
确保左侧表(或结果集)中的所有行都出现在最终结果集中;如果找不到右侧表格中的一行与左侧的行匹配,则会使用一整行NULL
s。对于尚未发送的订单项会发生这种情况(sh_delivery_items
中没有记录)。
然后,WHERE
子句仅保留NULL
表(di
)中具有sh_delivery_items
s的行,即未交付的行项目,以及拥有它们的订单。
最后,SELECT DISTINCT c.*
仅选择订单表(sh_comenzi
)和DISTINCT
中的列,确保每个订单仅出现一次。否则,每个订单对于未交付的每个订单项都会显示一次。
使用所需的ORDER BY
子句自行完成查询。