【问题标题】:Selecting all items in one table and join with another table, allowing nulls选择一个表中的所有项目并与另一个表连接,允许空值
【发布时间】:2011-07-13 00:41:33
【问题描述】:

我需要从表鸟类(基本上所有鸟类)中选择所有值,然后加入另一个跟踪谁喜欢那只鸟的表。

所以我希望查询返回所有鸟类,以及人们喜欢那只鸟的记录的 ID。如果没有任何人喜欢这只鸟的记录,那么该字段应该为空。

我当前的查询没有得到空值。这里是:

select  bird_name, member_id 
from birds  
right join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2 ;

如何确保birds 表中的每一行都显示一次?

【问题讨论】:

  • 是的,我曾尝试使用左连接,但由于某种原因,它仍然只返回匹配的行,而不是左表中的所有行。不知道可能是什么问题。
  • 如果 member_id 在bird_likes 表上,你就找到了罪魁祸首;)在这种情况下,请参阅我的答案以获得可行的解决方案。

标签: mysql sql


【解决方案1】:

您必须使用left join 而不是right join

不同的连接

inner join : 只保留两个表中都有数据的行

left join : 保留左表的所有行并从右表中添加可能的行

right join:保留右表的所有行,并从左表中添加可能的行

左表始终是我们已经拥有的表,右表是我们要加入的表。

作为记录,还有一个cross join,它将左表中的每一行与右表中的每一行连接起来,但这个并不经常使用。

我希望这一切现在对你来说更清楚了:)

更正查询

select  bird_name, member_id 
from birds  
left join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2;

请注意,这假定列 member_id 在 bird 表中,否则您可以保持这样的条件:

select  bird_name, member_id 
from birds  
left join bird_likes on 
    birds.bird_id = bird_likes.bird_id and
    bird_likes.member_id = 2;

【讨论】:

  • 我知道左连接应该可以工作,但它仍然只返回 where 子句匹配的行,而不是鸟表中的所有行:(
  • @Genadinik where子句从所有表中过滤数据,如果member_id在bird_likes表中,请检查我的第二个解决方案,在这种情况下您必须将条件移动到连接!
【解决方案2】:

在这种情况下你想使用left outer join

select  bird_name, member_id 
from birds  
left outer join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2;

这将返回所有鸟的名字,对于空喜欢的鸟的名字和'null'。

【讨论】:

  • 由于某种原因没有返回所有的鸟:(
【解决方案3】:
SELECT bird_name, member_id
FROM birds
LEFT JOIN bird_likes ON birds.bird_id=bird_likes.bird_id AND member_id=2

【讨论】:

    【解决方案4】:

    将您的 RIGHT JOIN 更改为 LEFT JOIN,这将引入所有 birds 记录,无论它们是否与 bird_likes 有关系

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 2020-08-17
      • 2017-11-13
      • 1970-01-01
      • 2017-02-23
      • 2021-12-30
      • 2014-12-16
      • 2015-05-03
      • 2016-05-18
      相关资源
      最近更新 更多