题解 | #网易云音乐推荐#

网易云音乐推荐

http://www.nowcoder.com/questionTerminal/048ed413ac0e4cf4a774b906fc87e0e7

一步一步拆解问题,最后组合起来。

  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. 查询user_id = 1 的用户,其关注的人喜欢的音乐,同时排除该用户已经喜欢的音乐(music_id)。接着,连接表music,获得音乐name,并且按music的id升序排列,返回的结果不包含重复项。即最终的代码为:
    select
     distinct music_name
    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
    ;
全部评论
user_id not in 那里为什么不可以改成!=不等于1之类的写法呢
1 回复 分享
发布于 2021-12-19 19:23
都不运行一下么?错误的也放?
18 回复 分享
发布于 2022-02-21 19:54
都是托吗 这代码跑不过去 DISTINCT和ORDER BY 一起会运行不了
11 回复 分享
发布于 2022-03-14 23:53
因为distinct不能与order by连用,应该把distinct放到a中的查询中
10 回复 分享
发布于 2022-05-04 15:40
试了下发现distinct去重字段必须要和order by中排序字段相同才可用; 和group by与order by同时使用条件相似, order by是对group by分组结果排序, 所以其中排序字段必须是group by中字段或者聚合函数; 这里要么选择在上一个子查询中使用distinct music_id, 要么选择group by music_id去重.
9 回复 分享
发布于 2023-04-26 19:05 广东
distinct应该放在里面的子查询中
7 回复 分享
发布于 2022-01-28 20:30
order by id这个id不在select里面,所以错误。应该把排序order by music_id放在a表查询里面
2 回复 分享
发布于 2022-05-27 21:48
这一步步写的好清晰 感觉SQL最重要的是理清这一步步 然后再写代码
2 回复 分享
发布于 2021-11-13 14:12
思路和清晰,学习了。 根据题意拆解问题。 1.先找出id为1用户的关注者 2.获取该关注者喜欢的音乐id 3.排除用户喜欢和该关注喜欢重复的音乐 4.连接音乐表获取名字 根据上面步骤一步一步写sql语句,最后合并,循序渐进,比一开始就往结果处理有条理且不容易混乱和出错。
1 回复 分享
发布于 2024-10-15 11:11 广东
思路是清晰,不过尽量不要用in,这样会导致运行效率极低
1 回复 分享
发布于 2024-09-27 12:36 江苏
虽然有小瑕疵,但是这个分析的思路非常清晰,大赞
1 回复 分享
发布于 2024-09-07 20:24 广东
你确定能过吗
1 回复 分享
发布于 2024-03-18 16:31 四川
不会牛客真的都是托吧,order by字段与distinct在牛客的Mysql运行环境不通过,但是在我自己安装的8.0.28环境上可以通过,所以大家都没有疑问吗?
1 回复 分享
发布于 2023-07-20 21:42 安徽
这一步一步分析恍然大悟
1 回复 分享
发布于 2021-10-04 12:21
后面改一下: group by music_name order by min(m.id)
点赞 回复 分享
发布于 09-21 17:02 浙江
运行不出来呀
点赞 回复 分享
发布于 02-24 17:10 河南
你这还是有点小问题啊,运行不过
点赞 回复 分享
发布于 2024-09-24 09:12 河南
测试用例通过了8个。不知道问题处在什么地方了: SELECT music_name FROM music WHERE id IN ( SELECT DISTINCT music_id FROM follow AS F RIGHT JOIN music_likes AS M ON M.user_id = F.follower_id WHERE F.user_id = 1 AND music_id != ( SELECT music_id FROM music_likes WHERE user_id = 1 ) ) ORDER BY id ASC;
点赞 回复 分享
发布于 2023-09-11 16:44 香港
清晰的逻辑,令人赏心悦目~
点赞 回复 分享
发布于 2021-11-15 16:33

相关推荐

08-27 12:02
已编辑
南京外国语学校 网络安全
再来一遍:实则劝各位不要all in华子,不要相信华为hr
点赞 评论 收藏
分享
评论
97
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务