使用Where和left join获取null值

时间:2014-12-18 23:01:38

标签: mysql sql hibernate

让我们来看看这个问题

   select music,fav from MUSIC music

        left join  Favorite_Music fav on fav.id_music  = music.id_music  

        where fav.id_user= 22 or fav.id_user is NULL

我的表Music

  id_music  |  ....

     1      |  
     ...    |   
     100    |  

我的表Favorite_Music

id_fav  |  id_music  |  id_user

 1      |   15        |  22  
 2      |   20        |  22  
 3      |   40        |  30  

我想要检索所有MUSIC,有些东西我想标记我user 22最喜欢的音乐。

但是当我执行上面的查询时,music 40不包括在内!!

所以我希望得到music的所有Favorite_Music并获取{{1}}的空值,这不属于我的22位用户。

2 个答案:

答案 0 :(得分:1)

您必须在join子句中对外连接表应用过滤器,而不是where子句。像这样:

select music,fav 
from MUSIC music
left join  Favorite_Music fav on fav.id_music  = music.id_music  
and (fav.id_user= 22 or fav.id_user is NULL )

当你在where子句中过滤时,这看起来很明显,你的外连接变成了一个隐式的内连接。

答案 1 :(得分:1)

这是我认为你想要的查询:

select music, (case when fav.id_user is not null then 'No' else 'Yes' end) as IsFav22
from MUSIC music left join
     Favorite_Music fav
     on fav.id_music = music.id_music and fav.id_user = 22;