1264.页面推荐
一、题目链接
二、题目描述
朋友关系列表: Friendship
±--------------±--------+
| Column Name | Type |
±--------------±--------+
| user1_id | int |
| user2_id | int |
±--------------±--------+
(user1_id, user2_id) 是这张表具有唯一值的列的组合。
这张表的每一行代表着 user1_id 和 user2_id 之间存在着朋友关系。
喜欢列表: Likes
±------------±--------+
| Column Name | Type |
±------------±--------+
| user_id | int |
| page_id | int |
±------------±--------+
(user_id, page_id) 是这张表具有唯一值的列的组合。
这张表的每一行代表着 user_id 喜欢 page_id。
编写解决方案,向user_id = 1 的用户,推荐其朋友们喜欢的页面。不要推荐该用户已经喜欢的页面。
以 任意顺序 返回结果,其中不应当包含重复项。
返回结果的格式如下例所示。
示例 1:
输入:
Friendship table:
user1_id | user2_id |
---|---|
1 | 2 |
1 | 3 |
1 | 4 |
2 | 3 |
2 | 4 |
2 | 5 |
6 | 1 |
Likes table:
user_id | page_id |
---|---|
1 | 88 |
2 | 23 |
3 | 24 |
4 | 56 |
5 | 11 |
6 | 33 |
2 | 77 |
3 | 77 |
6 | 88 |
输出:
recommended_page |
---|
23 |
24 |
56 |
33 |
77 |
解释:
用户1 同 用户2, 3, 4, 6 是朋友关系。
推荐页面为: 页面23 来自于 用户2, 页面24 来自于 用户3, 页面56 来自于 用户3 以及 页面33 来自于 用户6。
页面77 同时被 用户2 和 用户3 推荐。
页面88 没有被推荐,因为 用户1 已经喜欢了它。
三、建表语句
Create table If Not Exists Friendship (user1_id int, user2_id int)
Create table If Not Exists Likes (user_id int, page_id int)
Truncate table Friendship
insert into Friendship (user1_id, user2_id) values ('1', '2')
insert into Friendship (user1_id, user2_id) values ('1', '3')
insert into Friendship (user1_id, user2_id) values ('1', '4')
insert into Friendship (user1_id, user2_id) values ('2', '3')
insert into Friendship (user1_id, user2_id) values ('2', '4')
insert into Friendship (user1_id, user2_id) values ('2', '5')
insert into Friendship (user1_id, user2_id) values ('6', '1')
Truncate table Likes
insert into Likes (user_id, page_id) values ('1', '88')
insert into Likes (user_id, page_id) values ('2', '23')
insert into Likes (user_id, page_id) values ('3', '24')
insert into Likes (user_id, page_id) values ('4', '56')
insert into Likes (user_id, page_id) values ('5', '11')
insert into Likes (user_id, page_id) values ('6', '33')
insert into Likes (user_id, page_id) values ('2', '77')
insert into Likes (user_id, page_id) values ('3', '77')
insert into Likes (user_id, page_id) values ('6', '88')
四、题目解答
1、思路讲解
题目表面很简单,先找到用户为1的朋友,然后再连接Likes表去输出
但是有两个难点
第一是怎么样从Friedship中选取出用户1的朋友,考虑使用case when,但是会有null值,没事,使用join连接时候null值就不存在了
select
case when user1_id=1 then user2_id
when user2_id=1 then user1_id
end
as user_id
from Friendship
user_id |
---|
2 |
3 |
4 |
null |
null |
null |
6 |
第二是要去掉用户1喜欢的页面,这个很关键,数据过滤你要仔细想好应该什么时候过滤,同时也要注意!!,不能直接使用 <>或者是!=,因为用户1可能喜欢的不止一个页面,需要使用not in,最终代码实现如下
2、代码实现
select distinct page_id as recommended_page from (select
case when user1_id=1 then user2_id
when user2_id=1 then user1_id
end
as user_id
from Friendship )f
join Likes
on f.user_id=Likes.user_id
where page_id not in (select page_id from Likes where user_id=1)
recommended_page |
---|
23 |
24 |
56 |
33 |
77 |
五、知识总结
①case when如果不写else,那么其他情况默认输出为null
②数据过滤需要考虑清楚情况,数据过滤的顺序和sql执行的顺序一定要明确,同时要确定数据的过滤条件,如果有多组的话,要使用in或者not in