首页 > 试题广场 >

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

[编程题]网易云音乐推荐(网易校招笔试真题)
  • 热度指数:152563 时间限制: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 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)
select
    n2.music_name
from
(
    select
        t1.music_id
    from
    (
        select
            m2.music_id
        from
        (
            select
                user_id
                ,follower_id
            from follow
            where user_id=1
        )m1
        inner join
            music_likes m2
        on m1.follower_id=m2.user_id
        group by m2.music_id
    )t1
    left join
    (
    select
        music_id
    from music_likes
    where user_id=1
    )t2
    on t1.music_id=t2.music_id
    where t2.music_id is null
)n1
inner join
    music n2
on n1.music_id=n2.id
order by n1.music_id

发表于 2025-07-30 19:50:25 回复(0)
# 1. 查询向user_id = 1 的用户,推荐其关注的人

select
    follower_id
    from follow
    where user_id = 1

# 2. 查询向user_id = 1 的用户,推荐其关注的人喜欢的音乐

select
    music_id
    from music_likes
    where  user_id in(
            select
            follower_id
            from follow
            where user_id = 1
       )
# 3.不要推荐该用户已经喜欢的音乐,
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
    )  
# 最终
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_id = 1
        )  
        and music_id not in(
            select music_id from music_likes where user_id =1
        )
    )
    order by id asc;

# 1. 查询向user_id = 1 的用户,推荐其关注的人

select 
    follower_id
    from follow 
    where user_id = 1

# 2. 查询向user_id = 1 的用户,推荐其关注的人喜欢的音乐

select 
    music_id
    from music_likes
    where  user_id in(
            select 
            follower_id
            from follow 
            where user_id = 1
       )
# 3.不要推荐该用户已经喜欢的音乐,
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
    )  
# 最终
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_id = 1
        )  
        and music_id not in(
            select music_id from music_likes where user_id =1
        )
    )
    order by id asc;

发表于 2025-07-20 12:04:18 回复(0)
WITH
  temp1 AS(
    SELECT DISTINCT id, music_name
    FROM music_likes ml
    JOIN music m ON ml.music_id = m.id
    WHERE user_id IN (SELECT follower_id FROM follow WHERE user_id = 1)
  ),
  temp2 AS(
    SELECT id, music_name
    FROM music_likes ml
    JOIN music m ON ml.music_id = m.id
    WHERE user_id = 1
  )

SELECT music_name
FROM temp1
WHERE music_name NOT IN (SELECT music_name FROM temp2)
ORDER BY id

发表于 2025-05-11 19:00:04 回复(0)
用了直接方法,建了两个临时表,拿到了 user1的喜欢人和喜欢歌曲,之后剔除就行
with t1 as(
    select
        follower_id
    from
        follow
    where user_id = 1),
t2 as(
    select 
        (case when music_id in (select music_id from music_likes where user_id=1) then null else music_id end) as name
    from 
        music_likes
    where user_id in (select follower_id from t1)
)
select music_name from music where id in (select name from t2)


发表于 2025-05-08 15:57:11 回复(0)
select music_name
from follow a 
left join music_likes b 
on a.follower_id = b.user_id 
left join music c 
on b.music_id = c.id
where a.user_id = 1
and b.music_id not in (
    select music_id 
    from music_likes 
    where user_id = 1)
group by c.id
order by c.id

发表于 2025-05-07 15:03:45 回复(0)
with tmp as
(
    select
    user_id,
    music_id,
    music_name
    from music_likes
    left join music
    on music.id=music_likes.music_id
)
select
music_name
from
(
    select
    distinct music_name,
    music_id
    from follow
    inner join tmp
    on follow.follower_id=tmp.user_id
    where follow.user_id=1
    and music_name not in
    (
        select
        distinct music_name
        from follow
        inner join tmp
        on follow.user_id=tmp.user_id
        where follow.user_id=1
    )
) as t
order by music_id
发表于 2025-04-29 17:44:14 回复(0)
select music_name from (select distinct m.music_name, ml.music_id 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
) a where (select music_id from music_likes where user_id = 1 ) not in (a.music_id) order by a.music_id
发表于 2025-04-17 17:56:34 回复(0)
select music_name
from(
select distinct  c.music_name, b.music_id  
from follow a
left join music_likes b
on a.follower_id=b.user_id
left join music c
on b.music_id=c.id
where a.user_id=1 and b.music_id not in(select music_id from music_likes where user_id =1)
order by b.music_id
)d
发表于 2025-04-09 13:54:08 回复(0)
with new1 as(
    select
    distinct f.user_id,music_id,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
)
    select
    n1.music_name
    from
    new1 n1
    join
    music_likes ml
    on n1.user_id=ml.user_id
    where n1.music_id <> ml.music_id
    order by n1.music_id
求助:为什么这个代码只能通过80%
发表于 2025-04-07 14:46:18 回复(0)