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

时间:2018-01-21 16:50:53

标签: mysql left-join

通过检查表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

顺序

SELECT * FROM Products p
LEFT JOIN order o
ON p.pid = o.opid
WHERE p.pid = 100
AND o.buyer = 'peter'

SQL QUERY

 this.postService.delete(ps).subscribe(resp => this.res = resp);
 console.log('result'+this.res);

2 个答案:

答案 0 :(得分:1)

我没有看到查询有任何问题。

我运行了上述查询

SELECT * FROM Products p
LEFT JOIN order o
ON p.pid = o.opid
WHERE p.pid = 100
AND o.buyer = 'peter'

只有当买家彼得时才会产生回应。

但它不是一个优化的查询,因为这里你首先获取所有结果,即使订单表中没有数据作为买方和其他信息,然后使用where子句优化它以删除买方不是彼得的那个。相反,

SELECT * FROM Products p  INNER JOIN order1 o ON p.pid = o.opid WHERE p.pid = 1 AND o.buyer = 'peter'

INNER JOIN返回两个表的所有交集数据。然后where子句过滤买方是彼得的

我建议在你的查询中使用一个omtimization,不要使用买方名称而是为用户创建一个映射表并存储userId,因为会有许多同名的用户。最好将表格标准化。

答案 1 :(得分:0)

第二个表上的条件需要进入on子句:

SELECT *
FROM Products p LEFT JOIN
     order o
     ON p.pid = o.opid AND o.buyer = 'peter'
WHERE p.pid = 100;

这似乎相当神秘,但规则很容易学习。无论left join子句的计算结果为true,false还是ONNULL都会保留第一个表中的所有行。但是,第二个表中的值变为NULL,因此WHERE子句会过滤掉不匹配的买方,将外部联接转换为内部联接。

同样的原因解释了为什么 first 表中的条件应该放在WHERE子句而不是ON子句中。