我正在尝试通过检查product.pid
表中是否存在商品来检查查看当前产品的用户是否已经购买了该产品order.opid
。以下查询无需添加AND o.buyer = 'peter'
where子句即可工作,但对于我针对当前查看该产品的用户验证查询非常重要。
产品展示
pid | pname
------|--------------
100 | Toyota
200 | Lexus
订购
oid | opid | buyer | opname | color
-----|-------|------------------|-------
M10 | 100 | peter |Toyota | red
M11 | 100 | peter |Toyota | black
M12 | 100 | john |Toyota | black
M13 | 200 | peter |Lexus | black
SQL查询
SELECT * FROM Products p
LEFT JOIN order o
ON p.pid = o.opid
WHERE p.pid = 100
AND o.buyer = 'peter'
第二个表上的条件需要放在on
子句中:
SELECT *
FROM Products p LEFT JOIN
order o
ON p.pid = o.opid AND o.buyer = 'peter'
WHERE p.pid = 100;
这看起来似乎很神秘,但是规则很容易学习。Aleft join
将所有行保留在第一个表中,无论该ON
子句的计算结果为true,false还是NULL
。但是,第二个表中的值变为NULL
,因此该WHERE
子句筛选出了不匹配的购买者,从而将外部联接变为内部联接。
同样的道理也解释了为什么第一个表的条件应该放在WHERE
子句中而不是ON
子句中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句