left join with where子句

时间:2013-09-17 23:14:02

标签: mysql join

我有以下表格

折扣

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 必须为“视频

2 个答案:

答案 0 :(得分:1)

关于OUTER JOINLEFT JOIN之间的区别,这是RIGHT JOIN s(ON / WHERE)的一个常见错误。

考虑它的一种方法是根据SQL语句的逻辑顺序(不一定是在实践中检索数据的顺序,而是提取意义的理论顺序);在这种情况下:

  • 首先,使用JOIN子句将表格ON编辑在一起,生成一组结果
  • 然后,应用WHERE子句,删除条件不匹配的结果

在您的查询中,您首先要连接videosdiscounts表,将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)