通过检查表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);
答案 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还是ON
,NULL
都会保留第一个表中的所有行。但是,第二个表中的值变为NULL
,因此WHERE
子句会过滤掉不匹配的买方,将外部联接转换为内部联接。
同样的原因解释了为什么 first 表中的条件应该放在WHERE
子句而不是ON
子句中。