牛客网 SQL93.网易云音乐推荐

描述

假设云音乐数据库里面现在有几张如下简化的数据表:
关注follow表,第一列是关注人的id,第二列是被关注人的id,这2列的id组成主键

user_idfollower_id
12
14
23


这张表的第一行代表着用户id为1的关注着id为2的用户
这张表的第二行代表着用户id为1的关注着id为4的用户
这张表的第三行代表着用户id为2的关注着id为3的用户

个人的喜欢的音乐music_likes表,第一列是用户id,第二列是喜欢的音乐id,这2列的id组成主键

user_idmusic_id
117
218
219
320
417


这张表的第一行代表着用户id为1的喜欢music_id为17的音乐
....
这张表的第五行代表着用户id为4的喜欢music_id为17的音乐

音乐music表,第一列是音乐id,第二列是音乐name,id是主键

idmusic_name
17yueyawang
18kong
19MOM
20Sold Out


请你编写一个SQL,查询向user_id = 1 的用户,推荐其关注的人喜欢的音乐。
不要推荐该用户已经喜欢的音乐,并且按music的id升序排列。你返回的结果中不应当包含重复项
上面的查询结果如下:

music_name
kong
MOM

题解:

1、查询user_id = 1 的用户,其关注的人(follower_id )

select follower_id from follow where user_id = 1

2、查询user_id = 1 的用户,其关注的人喜欢的音乐 (music_id)

select music_id from music_likes
where user_id in (select follower_id from follow where user_id = 1);

3、查询user_id = 1 的用户,其关注的人喜欢的音乐,同时排除该用户已经喜欢的音乐(music_id)

select music_id from music_likes
where user_id in (select follower_id from follow where user_id = 1)
and music_id not in (select music_id from music_likes where user_id = 1);

4、接着,连接表music,获得音乐name,并且按music的id升序排列,返回的结果不包含重复项。

注意:order by的字段必须要出现在select中

select music_name
from(
    select distinct music_name,m.id
    from (
	     select music_id from music_likes
	     where user_id in (select follower_id from follow where user_id = 1)
	     and music_id not in (select music_id from music_likes where user_id = 1)
    ) a
    join music m on a.music_id = m.id
    order by id
)t


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值