1

我有以下表格

折扣

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

通过以下查询,我只得到前两行。我知道这是因为我有“and discounts.product_type='videos'”,但是......我不知道要添加什么。

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

4

2 回答 2

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)
于 2013-09-17T23:47:43.427 回答
1

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

一种思考方式是根据 SQL 语句的逻辑顺序(不一定是实际检索数据的顺序,而是提取含义的理论顺序);在这种情况下:

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

在您的查询中,您首先连接videosdiscounts表,将NULLs 留在没有discount匹配的地方。然后,您将该结果集过滤到那些行 where discounts.product_type='videos'- 从而删除任何行 where discounts.product_type IS NULL

换句话说,ON子句作为对哪些行加入的限制,而WHERE子句作为对哪些行返回的限制。您希望将其他discounts.product_type值的行排除在联接之外,而不是完全排除在查询之外。

它归结为与此答案相同:将条件移至子句,或在 where 子句中ON明确说明。NULL

于 2013-09-17T23:26:59.410 回答