这道题目要求我们为用户推荐其关注的人喜欢的音乐。我们要做的事情如下:
1. 确定总体问题
我们需要为用户ID为1的用户推荐其关注的人喜欢的音乐,排除用户自己已经喜欢的音乐,并按音乐ID升序排列,返回的结果中不包含重复项。
2. 分析关键问题
- 找出用户关注的人:从
follow
表中找出用户ID为1关注的用户。 - 获取关注者喜欢的音乐:从
music_likes
表中找出这些关注者喜欢的音乐。 - 排除用户自己喜欢的音乐:排除用户ID为1自己已经喜欢的音乐。
- 获取音乐名称:从
music
表中获取音乐名称。 - 排序输出:按音乐ID升序排列。
3. 解决每个关键问题的代码及讲解
步骤1:找出用户关注的人
我们从follow
表中找出用户ID为1关注的用户,然后通过链接music_likes表以寻找所关注人喜欢的音乐:
JOIN follow f ON ml.user_id = f.follower_id
WHERE f.user_id = 1
JOIN follow f ON ml.user_id = f.follower_id
:通过被关注者ID连接。
步骤2:获取关注者喜欢的音乐
从music_likes
表中找出这些关注者喜欢的音乐:
JOIN music m ON ml.music_id = m.id
JOIN music m ON ml.music_id = m.id
:通过音乐ID连接,获取关注者喜欢的音乐。
步骤3:排除用户自己喜欢的音乐
排除用户ID为1自己已经喜欢的音乐:
AND ml.music_id NOT IN (
SELECT music_id
FROM music_likes
WHERE user_id = 1
)
ml.music_id NOT IN (...)
:排除用户ID为1自己已经喜欢的音乐。
步骤4:获取音乐名称
从music
表中获取音乐名称:
SELECT DISTINCT m.id, m.music_name
SELECT DISTINCT m.id, m.music_name
:获取音乐ID和名称,并去重。
步骤5:排序输出
按音乐ID升序排列:
ORDER BY id
完整代码
SELECT music_name
FROM (
SELECT DISTINCT m.id, m.music_name
FROM music_likes ml
JOIN follow f ON ml.user_id = f.follower_id
JOIN music m ON ml.music_id = m.id
WHERE f.user_id = 1
AND ml.music_id NOT IN (
SELECT music_id
FROM music_likes
WHERE user_id = 1
)
) AS subquery
ORDER BY id;