Leetcode 1892. 页面推荐Ⅱ

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

4.执行结果

posted @ 2025-06-06 07:55  Geek0070  阅读(13)  评论(0)    收藏  举报