题干“查询向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;