# 请你编写一个SQL,查询向user_id = 1的用户,推荐其关注的人喜欢的音乐。
# 不要推荐该用户已经喜欢的音乐,并且按music的id升序排列。你返回的结果中不应当包含重复项。
-- 基本思路:按要求,选出user_id=1用户的关注者喜欢的音乐,并排除他自己喜欢的音乐
with
s1 as (
select
user_id,
music_id,
music_name
from
music_likes
left join music on music_id = id -- 音乐id和音乐名一一对应连接起来,包含user_id组成一张大表s1
),
s2 as (
select
user_id,
music_id,
music_name
from
s1
where
user_id in (
select
follower_id
from
follow f
where
f.user_id = 1 -- user_id = 1 的用户的关注者喜欢的音乐s2
)
),
s3 as (
select
user_id,
music_id,
music_name
from
s1
where
user_id = 1 -- user_id = 1 的用户喜欢的音乐s3
)
select
music_name -- MySQL 的默认 SQL 模式(如 ONLY_FULL_GROUP_BY)要求:
from -- 如果使用了 DISTINCT,那么 ORDER BY 的列必须出现在 SELECT 列表中,否则会报错。
( -- 如果必须按 musicid 排序但不想显示它,可以用子查询先过滤,再排序
select distinct
music_id,
music_name
from
s1
where
music_id in (
select
music_id
from
s2
)
and music_id not in(
select
music_id
from
s3
)
) as temp
order by
music_id;