Mysql只在一个表中使用where子句左连接检查记录

Mysql只在一个表中使用where子句左连接检查记录,mysql,left-join,Mysql,Left Join,我试图通过检查表order.opid中是否存在product.pid来检查查看当前产品的用户之前是否已经购买了该产品。下面的查询不需要在where子句中添加和o.buyer='peter',但非常重要的是,我要针对当前查看产品的用户验证查询 产品 pid | pname ------|-------------- 100 | Toyota 200 | Lexus 命令 SQL查询 SELECT * FROM Products p LEFT JOIN order o ON p.pi

我试图通过检查表
order.opid
中是否存在
product.pid
来检查查看当前产品的用户之前是否已经购买了该产品。下面的查询不需要在where子句中添加
和o.buyer='peter'
,但非常重要的是,我要针对当前查看产品的用户验证查询

产品

pid   | pname 
------|--------------
100   | Toyota
200   | Lexus
命令

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;
这可能看起来相当神秘,但规则很容易掌握。
left join
保留第一个表中的所有行,不管
ON
子句的计算结果是true、false还是
NULL
。但是,第二个表中的值变为
NULL
,因此
WHERE
子句过滤掉不匹配的购买者,将外部联接变成内部联接


同样的推理解释了为什么第一个表上的条件应该放在
WHERE
子句中,而不是
on
子句中。

我看不出查询有任何错误

我运行了上述查询

SELECT * FROM Products p
LEFT JOIN order o
ON p.pid = o.opid
WHERE p.pid = 100
AND o.buyer = 'peter'
而且只有当买家是彼得时才会有回应

但这并不是一个优化的查询,因为在这里,您将首先获取所有结果,即使数据不存在于订单表中,并使用null as buyer和其他信息,然后使用where子句对其进行优化,以删除买方不是peter的查询。相反

SELECT * FROM Products p  INNER JOIN order1 o ON p.pid = o.opid WHERE p.pid = 1 AND o.buyer = 'peter'
内部联接返回两个表的所有交集数据。然后where子句过滤买方是peter的位置


我建议在您的查询中进行一次优化,不要使用买方名称,而是为user和store userId创建一个映射表,因为将有许多同名的用户。最好规范化该表。

在WHERE子句中添加买方支票时,有什么不起作用?请编辑你的问题,包括你期望的结果和你得到的结果。(不得不使用Oracle,因为MySQL现在没有在SQLFiddle上运行)在我看来,它给出了正确的结果——但正如我所说,我不知道您的期望是什么。
SELECT * FROM Products p  INNER JOIN order1 o ON p.pid = o.opid WHERE p.pid = 1 AND o.buyer = 'peter'