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

问题描述 投票:4回答:4

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

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

mysql sql
4个回答
28
投票

您必须使用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在鸟表中,否则您可以保持这样的条件:

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;

3
投票
SELECT bird_name, member_id
FROM birds
LEFT JOIN bird_likes ON birds.bird_id=bird_likes.bird_id AND member_id=2

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.