首页 > 试题广场 >

网易云音乐推荐(网易校招笔试真题)

[编程题]网易云音乐推荐(网易校招笔试真题)
  • 热度指数:128174 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
假设云音乐数据库里面现在有几张如下简化的数据表:
关注follow表,第一列是关注人的id,第二列是被关注人的id,这2列的id组成主键
user_id follower_id
1 2
1 4
2 3
比如第一行代表着用户id为1的关注着id为2的用户

个人的喜欢的音乐music_likes表,第一列是用户id,第二列是喜欢的音乐id,这2列的id组成主键
user_id music_id
1 17
2 18
2 19
3 20
4 17
比如第一行代表着用户id为1的喜欢music_id为17的音乐

音乐music表,第一列是音乐id,第二列是音乐name,id是主键
id music_name
17 yueyawang
18 kong
19 MOM
20 Sold Out

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

输入

CREATE TABLE `follow` (
`user_id` int(4) NOT NULL,
`follower_id` int(4) NOT NULL,
PRIMARY KEY (`user_id`,`follower_id`));

CREATE TABLE `music_likes` (
`user_id` int(4) NOT NULL,
`music_id` int(4) NOT NULL,
PRIMARY KEY (`user_id`,`music_id`));

CREATE TABLE `music` (
`id` int(4) NOT NULL,
`music_name` varchar(32) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO follow VALUES(1,2);
INSERT INTO follow VALUES(1,4);
INSERT INTO follow VALUES(2,3);

INSERT INTO music_likes VALUES(1,17);
INSERT INTO music_likes VALUES(2,18);
INSERT INTO music_likes VALUES(2,19);
INSERT INTO music_likes VALUES(3,20);
INSERT INTO music_likes VALUES(4,17);

INSERT INTO music VALUES(17,'yueyawang');
INSERT INTO music VALUES(18,'kong');
INSERT INTO music VALUES(19,'MOM');
INSERT INTO music VALUES(20,'Sold Out');

输出

kong
MOM
头像 牛客题解官
发表于 2025-02-26 15:21:01
精华题解 这道题目要求我们为用户推荐其关注的人喜欢的音乐。我们要做的事情如下: 1. 确定总体问题 我们需要为用户ID为1的用户推荐其关注的人喜欢的音乐,排除用户自己已经喜欢的音乐,并按音乐ID升序排列,返回的结果中不包含重复项。 2. 分析关键问题 找出用户关注的人:从follow表中找出用户ID为1关注 展开全文
头像 贪吃鼠
发表于 2021-08-27 17:07:30
一步一步拆解问题,最后组合起来。 查询user_id = 1 的用户,其关注的人(follower_id )select follower_id from follow where user_id = 1; 查询user_id = 1 的用户,其关注的人喜欢的音乐 (music_id)select 展开全文
头像 lpzbebetter
发表于 2022-05-26 22:21:57
原来我是将distinct和order by一起使用,但是发现运行报错: SQL_ERROR_INFO: "Expression #1of ORDER BY clause is not in SELECT list, references column 'm.id' 展开全文
头像 Lion灬Heart
发表于 2021-09-30 11:05:26
旧SQL语句: SELECT DISTINCT ( m.music_name ) FROM follow AS f LEFT JOIN music_likes AS ml ON f.follower_id = ml.user_id INNER JOIN music AS m ON ml.m 展开全文
头像 山水间边
发表于 2021-10-06 10:54:14
首先想到用联结,但是时间和压力下还是运用子查询将复杂问题分解为小问题。实际数据量大时,子查询的效率比联结效率低,in和exist在面对不同大小的内外表时效率也不同。 select music_name from music where id in ( select music_id fr 展开全文
头像 牛客589572691号
发表于 2022-06-06 19:12:23
看到题解里好多这部分的题的答案无法通过,分享一下自己的解题思路。    一、筛选出user_id为1用户关注的用户id where user_id in(select follower_id from follow&nb 展开全文
头像 biubiubiu~~~~
发表于 2021-11-06 22:20:54
参考答案 select music_name from music where id in ( select music_id from music_likes where user_id in( select follower_id from follow where user 展开全文
头像 Ding_123
发表于 2021-12-10 17:05:50
知识点 使用子查询首先推荐用户1关注的人就是follow表user_id=1的follower_id 之后音乐不能是用户1听过的,就是music_id not in(music_likes表里面user_id = 1) 最后再把music表连接一下,music_name不要重复再加个distinc 展开全文
头像 牛客135432601号
发表于 2022-03-09 11:03:45
一步一步地进行嵌套, 1.查出自己喜欢的音乐id 2.查出自己关注的人 3.查出自己关注的人喜欢的音乐id 4.喜欢的音乐id不能包含自己在内 5.根据id查出名字 select mu.music_name from music mu, (select distinct(s.music_id) mi 展开全文
头像 kinnl
发表于 2022-05-10 14:47:39
select tt.music_name from (select distinct m.music_name,m.id from follow f join music_likes ml on f.follower_id = ml.user_id join music m on ml.music 展开全文
头像 Juicelabxx
发表于 2024-09-14 14:56:46
SELECT m.music_name FROM follow f JOIN music_likes ml ON f.follower_id = ml.user_id JOIN music m ON ml.music_id = m.id WHERE 展开全文