首页 > 试题广场 >

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

[编程题]网易云音乐推荐(网易校招笔试真题)
  • 热度指数:80285 时间限制: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的用户
这张表的第二行代表着用户id为1的关注着id为4的用户
这张表的第三行代表着用户id为2的关注着id为3的用户

个人的喜欢的音乐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的音乐
....
这张表的第五行代表着用户id为4的喜欢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
头像 贪吃鼠
发表于 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 展开全文
头像 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 展开全文
头像 牛客589572691号
发表于 2022-06-06 19:12:23
看到题解里好多这部分的题的答案无法通过,分享一下自己的解题思路。    一、筛选出user_id为1用户关注的用户id where user_id in(select follower_id from follow&nb 展开全文
头像 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 展开全文
头像 广东菜心
发表于 2021-10-21 17:44:33
多表连接 + NOT IN解决 查询出user_id=1中关注的人喜欢的音乐。 select distinct m.music_name from follow f join music_likes ml on ml.user_id=f.follower_id join music 展开全文
头像 狒狒2022
发表于 2022-01-16 23:35:40
select music_name from ( select distinct music_id, music_name from ( select f1.user_id,f1.follower_id,ml.music_id,mc.music_name from follow as f1 join 展开全文
头像 L_1998
发表于 2021-10-31 08:51:37
# 请你编写一个SQL,查询向user_id = 1 的用户,推荐其关注的人喜欢的音乐。 # 不要推荐该用户已经喜欢的音乐,并且按music的id升序排列。你返回的结果中不应当包含重复项 # 思路: # 1.先在follow表中查询user_id为1的人关注的用户是谁 SELECT foll 展开全文
  • 二维码

    扫描二维码,关注牛客网

  • 二维码

    下载牛客APP,随时随地刷题