题解 | #网易云音乐推荐(网易校招笔试真题)#
网易云音乐推荐(网易校招笔试真题)
http://www.nowcoder.com/practice/048ed413ac0e4cf4a774b906fc87e0e7
网易云音乐推荐(网易校招笔试真题) 题目描述 假设云音乐数据库里面现在有几张如下简化的数据表: 关注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
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 id NOT IN (SELECT DISTINCT music_id FROM music_likes WHERE user_id=1 ) group up music_name;
解题步骤就是首先查询followe表查出来id等于1的所关注了那些人,并且通过关注人的id查询music_likes,得到关注人关注了那些音乐,同时联查id等于1 关注了那些音乐,将音乐id反选,查询music表,将查询出来的id放入表中作为查询条件