Mysql 选择一个表中的所有项并与另一个表联接,允许空值

Mysql 选择一个表中的所有项并与另一个表联接,允许空值,mysql,sql,Mysql,Sql,我需要从表birds(基本上是所有birds)中选择所有值,然后与另一个跟踪喜欢该鸟的人的表连接 因此,我希望查询返回所有鸟类,以及人们喜欢鸟类的记录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(基本上是所有birds)中选择所有值,然后与另一个跟踪喜欢该鸟的人的表连接

因此,我希望查询返回所有鸟类,以及人们喜欢鸟类的记录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表中的每一行都显示一次?

将您的右连接更改为左连接,这将引入所有
birds
记录,无论它们是否与
bird\u like

您必须使用
左连接
而不是
右连接

SELECT bird_name, member_id
FROM birds
LEFT JOIN bird_likes ON birds.bird_id=bird_likes.bird_id AND member_id=2
不同的连接
内部联接
:仅保留两个表中都有数据的行

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

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

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

对于记录,还有一个
交叉联接
,它将左表中的每一行与右表中的每一行联接在一起,但这个并不经常使用

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

更正的查询 请注意,这假设列
member\u 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;

在这种情况下,您希望使用
左外联接

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”。

是的,我用左连接尝试过,但出于某种原因,它仍然只返回匹配的行,而不是左表中的所有行。不确定可能是什么问题。如果成员id在bird\u likes表上,则您已找到罪犯;)在本例中,请参阅我的答案以获得有效的解决方案。由于某些原因,这并没有返回所有的bird:(我知道左连接应该可以工作,但它仍然只返回where子句中匹配的行,而不是birds表中的所有行:(@Genadinik where子句从所有表中筛选数据,检查我的第二个解决方案如果成员id在bird_likes表中,则在这种情况下必须将条件移动到连接!
select  bird_name, member_id 
from birds  
left outer join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2;