题干“查询向user_id = 1 的用户,推荐其关注的人喜欢的音乐。不要推荐该用户已经喜欢的音乐,并且按music的id升序排列。你返回的结果中不应当包含重复项”

思路描述:拆解题干中的要点,限定条件“user_id = 1 的用户,推荐其关注的人喜欢的音乐”可以先写出简单的select查询语句,得到其关注的人的user_id;再思考其喜欢的音乐,通过user_id可以select喜欢的音乐music_id;最后去联结music表

要点及注意点:

第一,三表联结,注意follow表与music_likes表联结时是通过(on)f.follower_id= ml.user_id,以达到“其关注的人喜欢的音乐”

第二,“不要推荐该用户已经喜欢的音乐”可以使用not in,但最好使用not exists较为高效;

第三,“返回的结果中不应当包含重复项”,可通过distinct对要查询的语句进行约束。

整理后的代码:

select distinct m.music_name
from music_likes as ml join music as m on ml.music_id=m.id
                       join follow as f on f.follower_id= ml.user_id
where f.user_id=1 and not exists (select ml.music_id
                                  from music_likes as ml1
                                  where ml1.user_id=1 and ml1.music_id=ml.music_id)
order by m.id;

最初的代码:

select distinct m.music_name
from music_likes as ml join music as m on ml.music_id=m.id
where ml.user_id in (select f.follower_id
                     from follow as f
                     where f.user_id=1)
      and ml.music_id not in (select music_id
                              from music_likes
                              where user_id=1)
order by m.id;