这道题目要求我们为用户推荐其关注的人喜欢的音乐。我们要做的事情如下:

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;