首页 > 试题广场 >

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

[编程题]网易云音乐推荐(网易校招笔试真题)
  • 热度指数:181350 时间限制: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
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 f.user_id=1
and m.id not in (select
music_likes.music_id
from music_likes 
where music_likes.user_id=1) 
group by m.id
order by m.id asc;


发表于 2026-01-20 16:21:30 回复(1)
WITH a AS (
    SELECT music_id
    FROM music_likes
    WHERE user_id = 1
),
b AS (
    SELECT follower_id
    FROM follow
    WHERE user_id = 1
),
c AS (
    SELECT DISTINCT ml.music_id
    FROM music_likes ml
    WHERE ml.user_id IN (SELECT follower_id FROM b)
),
d as(
    SELECT
    c.music_id,
    m.music_name
FROM c
LEFT JOIN a ON c.music_id = a.music_id
JOIN music m ON c.music_id = m.id
WHERE a.music_id IS NULL
ORDER BY c.music_id ASC
)
select
music_name
from
d

发表于 2026-01-13 19:59:22 回复(0)
SELECT music_name
FROM follow f 
    LEFT JOIN music_likes ml ON f.follower_id = ml.user_id
    LEFT JOIN music m ON ml.music_id = m.id
WHERE f.user_id = 1 AND m.id NOT IN (SELECT music_id FROM music_likes WHERE user_id = 1)
GROUP BY 1
ORDER BY MIN(m.id)
如果按music_id升序排列,但是去重music_name,那么如果出现同music_name不同music_id并且music_id相差很大的行,那么去重不同的music_id会出现不同的排序的,如上所示。
发表于 2026-01-11 07:31:04 回复(0)
select
e.music_name
from (select follower_id from follow a where user_id=1) c left join music_likes d on c.follower_id=d.user_id left join music e on  d.music_id=e.id
where music_id not in (select  music_id from music_likes where user_id=1) order by d.music_id
发表于 2026-01-09 11:05:51 回复(0)
select
    music_name
from
    music
where
    id in (
        select distinct
            music_id
        from
            follow f
            left join music_likes ml on f.follower_id = ml.user_id
        where
            f.user_id = 1
    )
    and id not in(
        select
            music_id
        from
            music_likes
        where
            user_id = 1
    )
order by
    id
发表于 2025-12-29 15:40:30 回复(0)
# 查询向user_id = 1 的用户,推荐其关注的人喜欢的音乐。 不要推荐该用户已经喜欢的音乐,并且按music的id升序排列。
with followedPeople as(
    select 
        follower_id
    from follow
    where user_id = 1
),
myMusic as(
    select
        music_id 
    from music_likes
    where user_id = 1
),

followerLoveMosic as (
    select distinct
        music_id
    from music_likes
    where user_id in (select * from followedPeople) and music_id not in (select * from myMusic)

)
select
    music_name
from followerLoveMosic left join music on followerLoveMosic.music_id = music.id
order by id

发表于 2025-12-24 19:27:43 回复(0)
#先表连接,什么用户喜欢什么音乐
select user_id, music_id, music_name
from music_likes ML
left join music M
on ML.music_id=M.id
#对用户1:不推荐什么音乐
select music_name from t where t.user_id=1
#对用户1:其关注的人喜欢的音乐
select music_name from t
where  user_id in
  (select follower_id from follow where user_id=1)
with t as
(select user_id, music_id, music_name
from music_likes ML
left join music M on ML.music_id=M.id)

select music_name from t
where  user_id in
  (select follower_id from follow where user_id=1)
and  music_name not in (select music_name from t where t.user_id=1)
order by music_id


发表于 2025-12-16 23:29:14 回复(0)

select d.music_name from

follow a

left join music_likes b on a.user_id =b.user_id

left join music_likes c on a.follower_id = c.user_id

left join music d on c.music_id = d.id

where a.user_id = 1 and b.music_id <> c.music_id

order by id ;
我写的这个保存提交时候会查询多出其他的音乐是为啥啊,在数据库中没问题啊
发表于 2025-12-11 15:11:03 回复(0)
with music_like as
(
    select
        ml1.music_id music_id
    from
        follow f left join music_likes ml1
        on f.follower_id = ml1.user_id
    where f.user_id = 1 and ml1.music_id not in
    (
        select
            music_id
        from
            music_likes
        where user_id = 1
    )
)
select
    music_name
from
(
    select
        distinct m.id id, m.music_name music_name
    from
        music_like ml2 left join music m
        on ml2.music_id = m.id
    order by id
) music_ref
发表于 2025-11-25 21:56:21 回复(0)
1.先将所有表连接,观察字段和数据
2.排除user_id=1喜欢的音乐
3.去重时使用group by替换distinct
select music_name from follow f join music_likes m on f.follower_id = m.user_id join music mu on m.music_id = mu.id where f.user_id = 1 and music_id not in (select music_id from music_likes where user_id = 1) group by music_id order by music_id;


发表于 2025-11-13 14:53:14 回复(0)
SELECT
  music.music_name
FROM
  music_likes
JOIN music ON music_likes.music_id = music.id
WHERE
  -- 条件1:筛选“我(user_id=1)关注的人”喜欢的音乐(修复冗余关联)
  music_likes.user_id IN (
    SELECT follow.follower_id 
    FROM follow 
    WHERE follow.user_id = 1  -- 直接查我关注的人,无需关联music_likes
  )
  -- 条件2:智能排除“我喜欢的音乐”(无喜欢音乐则自动失效)
  AND (
    -- 子查询:判断我是否有喜欢的音乐(存在则返回1,否则返回0)
    NOT EXISTS (SELECT 1 FROM music_likes WHERE user_id = 1)
    -- 若有喜欢的音乐,则排除;若无,则该条件恒为true(不影响结果)
    OR music_likes.music_id NOT IN (
      SELECT music_id FROM music_likes WHERE user_id = 1
    )
  )
GROUP BY
  music.id, music.music_name  -- 兼容ONLY_FULL_GROUP_BY,避免同名音乐误判
ORDER BY
  music.id;  -- 按音乐ID排序,符合预期输出顺序 菜鸟的尝试。。
发表于 2025-11-11 21:43:11 回复(0)
select m.music_name
from music_likes ml
left join follow f on ml.user_id = f.follower_id
left join music m on m.id=ml.music_id
where f.user_id = 1 and m.id not in(select music_id from music_likes where user_id =1)
group by m.id
order by m.id


这道题的难点在于distinct与order by 子句一起运行会报错,可以使用group by 子句代替distinct解决.
发表于 2025-11-01 19:08:59 回复(0)
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)