1.题目基本信息
1.1.题目描述
表: Friendship
±--------------±--------+
| Column Name | Type |
±--------------±--------+
| user1_id | int |
| user2_id | int |
±--------------±--------+
(user1_id,user2_id) 是 Friendship 表的主键(具有唯一值的列的组合)。
该表的每一行表示用户user1_id和user2_id是好友。
表: Likes
±------------±--------+
| Column Name | Type |
±------------±--------+
| user_id | int |
| page_id | int |
±------------±--------+
(user_id,page_id) 是 Likes 表的主键(具有唯一值的列)。
该表的每一行表示user_id喜欢page_id。
您正在为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 ,而 不被user_id喜欢 ,你的系统将 推荐 一个页面到user_id。
编写一个解决方案来查找针对每个用户的所有可能的 页面建议 。每个建议应该在结果表中显示为一行,包含以下列:
user_id: 系统向其提出建议的用户的ID。
page_id: 推荐为 user_id 的页面ID。.
friends_likes: user_id 对应 page_id 的好友数。
以 任意顺序 返回结果表。
1.2.题目地址
https://leetcode.cn/problems/page-recommendations-ii/description/
2.解题方法
2.1.解题思路
请参考步骤部分
2.2.解题步骤
第一步,将user2_id和user1_id互换位置union一份到Friendship表中。
第二步,将user2_id的收藏的page_id连接到FriendShip表上,然后过滤出表中(usr1_id,page_id)不在Likes表中的记录,得到子表t2。
第三步,根据(user1_id,page_id)从t1表中分组聚合统计记录数量。
3.解题代码
sql代码
# Write your MySQL query statement below
# 思路:第一步,将user2_id和user1_id互换位置union一份到Friendship表中。第二步,将user2_id的收藏的page_id连接到FriendShip表上,然后过滤出表中(usr1_id,page_id)不在Likes表中的记录,得到子表t2;第三步,根据(user1_id,page_id)从t1表中分组聚合统计记录数量
SELECT
t1.user1_id AS user_id,
page_id,
COUNT(*) AS friends_likes
FROM (
SELECT user1_id, user2_id FROM Friendship
UNION ALL
SELECT user2_id AS user1_id, user1_id AS user2_id FROM Friendship
) AS t1 LEFT JOIN Likes AS l ON t1.user2_id = l.user_id
WHERE NOT EXISTS (
SELECT * FROM Likes WHERE user_id = user1_id AND page_id = l.page_id
)
GROUP BY t1.user1_id, page_id