我有两张桌子
ps_cart包含以下列:
ps_orders有这个列:
基本上我想显示所有放弃购物车,即加入两个id_order为空的表。
我认为这样可以使用OUTER JOIN来实现..
SELECT cr.id_cart, o.id_order, cr.id_carrier, cr.id_address_delivery, cr.id_customer, cr.date_upd
FROM ps_cart AS cr
LEFT OUTER JOIN ps_orders AS o ON cr.id_cart = o.id_cart
WHERE cr.date_upd BETWEEN "2016-01-01" AND "2016-02-29"
ORDER BY cr.date_upd DESC
LIMIT 100;
然而我仍然在id_order不为null的结果(意味着已创建/完成订单)。我期望在id_order上获得null值。
我可以通过添加WHERE id_order = NULL子句来“欺骗”我的方式,但我觉得这可能不是最好的方法。
任何人都可以帮助我或向我解释为什么OUTER JOIN没有像我预期的那样工作?我错过了什么吗?
修改 我知道我想要什么,它是LEFT EXCLUDING JOIN 所以我的查询看起来像这样:
SELECT cr.id_cart, o.id_order, o.current_state, cr.id_carrier, cr.id_address_delivery, cr.id_customer, cr.date_upd
FROM ps_cart AS cr
LEFT JOIN ps_orders AS o ON cr.id_cart = o.id_cart
WHERE o.id_cart IS NULL
AND cr.date_upd BETWEEN "2016-02-01" AND "2016-02-29"
ORDER BY cr.date_upd DESC;
请参阅下面的图片,以便更好地说明我的意思。
答案 0 :(得分:0)
基本上联接是搜索某些键
LEFT OUTER JOIN ps_orders AS o ON cr.id_cart = o.id_cart
在这里,它只考虑那些与其他表匹配的cr.id_cart,null将被忽略。