关注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
一步一步拆解问题,最后组合起来。 查询user_id = 1 的用户,其关注的人(follower_id )select follower_id from follow where user_id = 1; 查询user_id = 1 的用户,其关注的人喜欢的音乐 (music_id)select
展开全文
原来我是将distinct和order by一起使用,但是发现运行报错:
SQL_ERROR_INFO: "Expression #1of ORDER BY clause is not in SELECT list,
references column 'm.id'
展开全文
旧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
展开全文
首先想到用联结,但是时间和压力下还是运用子查询将复杂问题分解为小问题。实际数据量大时,子查询的效率比联结效率低,in和exist在面对不同大小的内外表时效率也不同。 select music_name from music
where id in
(
select music_id fr
展开全文
知识点
使用子查询首先推荐用户1关注的人就是follow表user_id=1的follower_id
之后音乐不能是用户1听过的,就是music_id not in(music_likes表里面user_id = 1)
最后再把music表连接一下,music_name不要重复再加个distinc
展开全文
看到题解里好多这部分的题的答案无法通过,分享一下自己的解题思路。
一、筛选出user_id为1用户关注的用户id
where user_id in(select follower_id from follow&nb
展开全文
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
展开全文
多表连接 + 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
展开全文
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
展开全文