我有以下表格
折扣
id product_type product_id discounted_price
1 videos 1 20
2 videos 2 20
视频
id name
1 test-1
2 test-2
3 test-3
预期结果
id name discount_product_type discount_product_id discount_discounted_price
1 test-1 videos 1 20
2 test-2 videos 2 20
3 test-3 null null null
使用以下查询,我只获得前两行。我知道这是因为我有“和discounts.product_type ='视频'”,但是...我不知道要添加什么。
select videos.* from
videos left join discounts on videos.id = discounts.product_id where
videos.id in(1,2,3) and discounts.product_type='videos'
基本上,我想从视频表中获取1,2,3行以及折扣行,但 discounts.product_type 必须为“视频”
答案 0 :(得分:1)
关于OUTER JOIN
和LEFT JOIN
之间的区别,这是RIGHT JOIN
s(ON
/ WHERE
)的一个常见错误。
考虑它的一种方法是根据SQL语句的逻辑顺序(不一定是在实践中检索数据的顺序,而是提取意义的理论顺序);在这种情况下:
JOIN
子句将表格ON
编辑在一起,生成一组结果WHERE
子句,删除条件不匹配的结果在您的查询中,您首先要连接videos
和discounts
表,将NULL
放在没有匹配的discount
的位置。然后,您将该结果集过滤到discounts.product_type='videos'
的那些行 - 从而删除discounts.product_type IS NULL
中的所有行。
换句话说,ON
子句作为对哪些行加入的限制,而WHERE
子句作为对哪些行的限制返回。您希望将其他discounts.product_type
值的行留在联接之外,而不是完全不在查询之外。
归结为与this answer相同:将条件移至ON
子句,或在where子句中明确说明NULL
。
答案 1 :(得分:1)
您的WHERE子句排除了联接右侧表格中显示的空值。有几种方法可以解决这个问题:
将右侧表的查询移动到JOIN子句:
select videos.* from
videos left join discounts on videos.id = discounts.product_id and discounts.product_type='videos'
where videos.id in(1,2,3)
或者在WHERE子句中允许空值:
select videos.* from
videos left join discounts on videos.id = discounts.product_id
where videos.id in(1,2,3) and (discounts.product_type='videos' or discounts.product_type is null)