我需要从表中的鸟(基本上是所有鸟)中选择所有值,然后与另一个跟踪谁喜欢那只鸟的表联接。
因此,我希望查询返回所有鸟类,以及人们喜欢该鸟类的记录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表中的每一行都显示一次?
您必须使用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;
SELECT bird_name, member_id
FROM birds
LEFT JOIN bird_likes ON birds.bird_id=bird_likes.bird_id AND member_id=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'。
将您的RIGHT JOIN更改为LEFT JOIN,这将引入所有birds
记录,无论它们是否与bird_likes
有关系