首页 > 试题广场 >

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

[编程题]网易云音乐推荐(网易校招笔试真题)
  • 热度指数:161538 时间限制: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
with t1 as (
select follower_id from follow where user_id=1
),t2 as (
select distinct music_id,music_name
from music_likes x
join music y
on x.music_id=y.id
where user_id in (select * from t1)
),t3 as (
select  music_id,music_name
from music_likes x
join music y
on x.music_id=y.id
where user_id = 1
)
select music_name
from t2 
where music_id not in (select music_id from t3)
order by music_id

发表于 2025-10-15 22:45:39 回复(0)
WITH
    mu AS (
        SELECT
            m1.user_id,
            m2.id,
            m2.music_name
        FROM
            music_likes m1
            INNER JOIN music m2 ON m1.music_id = m2.id
    ),
    fl AS (
        SELECT DISTINCT
            f.user_id,
            mu.music_name,
            mu.id
        FROM
            follow f
            INNER JOIN mu ON f.follower_id = mu.user_id
    )
SELECT
    music_name
FROM
    fl
WHERE
    user_id = '1'
    AND music_name NOT IN(
        SELECT
            music_name
        FROM
            mu
        WHERE
            user_id = '1'
    )
ORDER BY
    id

发表于 2025-09-26 22:05:49 回复(0)

WITH t2 AS
(
SELECT
        DISTINCT
        f.follower_id,
        music_id
    FROM
        follow AS f
    LEFT JOIN music_likes AS m
    ON f.follower_id=m.user_id
    WHERE
        f.user_id = 1
        AND music_id IS NOT NULL
        AND music_id NOT IN
            (SELECT music_id FROM music_likes WHERE user_id =1)
)
SELECT
    music_name
FROM  music
WHERE
    id in (SELECT music_id FROM t2 )
ORDER BY
id
发表于 2025-09-26 14:05:23 回复(0)
有没有大佬能帮忙看看为啥错,感谢感谢!!!
select distinct m.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)
    order by music_id) a
inner join music m on a.music_id = m.id;
发表于 2025-09-25 19:30:35 回复(0)
select music_name
from follow f left join music_likes ml on ml.user_id = f.follower_id
left join music m on ml.music_id = m.id
where f.user_id = 1 and ml.music_id not in (
    select music_id from music_likes where user_id = 1
)
group by ml.music_id
order by ml.music_id
发表于 2025-09-16 10:00:56 回复(0)
with musicnames as (
    select f.user_id,f.follower_id,ml.music_id,m.music_name from
    follow as f
    inner join music_likes as ml on f.follower_id=ml.user_id
    inner join music as m on m.id=ml.music_id
    inner join music_likes as ml1 on f.user_id=ml1.user_id
    where f.user_id=1 and ml.music_id <> ml1.music_id
)

select music_name from
(select distinct music_id,music_name from musicnames) as query1
order by music_id asc;
发表于 2025-09-04 20:57:43 回复(0)
SELECT m.music_name
FROM music m
JOIN (
    SELECT DISTINCT ml.music_id
    FROM music_likes ml
    WHERE ml.user_id IN (SELECT follower_id FROM follow WHERE user_id = 1)
      AND ml.music_id NOT IN (SELECT music_id FROM music_likes WHERE user_id = 1)
) AS recommended_music ON m.id = recommended_music.music_id
ORDER BY m.id ASC;

发表于 2025-08-30 11:03:07 回复(0)
with gzdr as (
  select follower_id as gz_id
  from follow
  where user_id = 1
),
gzdr_music as(
  select
  distinct music_id as a_music_id,music_name
  from music_likes
  inner join gzdr on music_likes.user_id = gzdr.gz_id
  inner join music on music_id = id
)
select music_name
from gzdr_music
where a_music_id not in (select music_id from music_likes where user_id = 1)
order by a_music_id asc;
发表于 2025-08-28 17:45:59 回复(0)
-- 发现order by 与 distinc 不能共存 干脆重新建个表再取,有点流氓



select
    music_name
from(
with t1 as(
select
    follower_id
from follow f
where f.user_id = 1
)
select
    distinct music_name,
    m.id as id
from music_likes ml
join t1 on t1.follower_id = ml.user_id
join music m on ml.music_id = m.id
where music_id not in (
    select music_id
        from music_likes
        where user_id = 1
)
) as t2
order by t2.id


发表于 2025-08-27 22:35:34 回复(0)
/*
首先,根据follow表找到user_id=1所对应的follower_id
      select follower_id from follow  where user_id = 1
其次,在music_likes表中,将第一步得到的结果作为过滤条件,筛选出结果 得到表t1
      select user_id,music_id from music_likes
      where user_id in (select follower_id from follow  where user_id = 1)
再次,将得到的表t1 与music表 进行链接 得到表t3 注意:不同的被关注人可能喜欢的相同的音乐,因此需要删除重复值
      select distinct music_id, music_name from t1
      join music on t1.music_id = music.id
再次,此时得到的表t3中含有user_id=1 喜欢的音乐 需要将其过滤掉,得到表t2
      select music_name from t3 where music_name not in
      (select music_name from music where id in (select music_id from music_likes where user_id = 1)
最后,对表t2.music_id 进行升序排序
      select music_name from t2 order by music_id asc;

只要理清思路,这道题也就考察了子查询的知识点。我在刚作这道题的时候,只想着用left join的方法,提交后发现
有些情况没有考虑 然后用满外连接作,到了排序的时候依然会出现问题,没有找出解决方法,才换了条思路。
下面有我的满外连结的方法 有兴趣可以看看, 个人觉得麻烦 不如子查询好。
*/
with t2 as(
select distinct music_id, music_name from
(select user_id,music_id from music_likes
where user_id in (select follower_id from follow  where user_id = 1)) t1
join music on t1.music_id = music.id
where music_name not in
(select music_name from music where id in (select music_id from music_likes where user_id = 1))
)
select music_name from t2
order by music_id asc;

/*with t as(
select user_id,follower_id, music_id,music_name
from (
select l.user_id,follower_id, l.music_id
from music_likes l
left join follow f on l.user_id = f.user_id
union all
select l.user_id,follower_id, l.music_id
from music_likes l
right join follow f on l.user_id = f.user_id
where l.music_id is null
) s
left join music m on s.music_id = m.id
)

select  music_name from
(select distinct music_name,music_id from t
where user_id in (select follower_id from t where user_id = 1)) a
where music_name != (select distinct music_name from t where user_id = 1)
order by music_id asc;
*/

发表于 2025-08-24 12:10:33 回复(1)
没有明白为什么oder by不能在最外层 是因为临时表的原因吗
发表于 2025-08-05 15:14:49 回复(1)
SELECT music_name
from music
WHERE id in
(SELECT music_id
from music_likes
where user_id in (
SELECT follower_id
from  follow
WHERE follower_id in (SELECT user_id from music_likes)
and user_id =1))
and id not in (SELECT music_id from music_likes
where user_id = 1)
order by id
发表于 2025-07-31 20:19:28 回复(0)