LeetCode--1264. 页面推荐

76 阅读2分钟

1 题目描述

朋友关系列表: 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 的用户,推荐其朋友们喜欢的页面。不要推荐该用户已经喜欢的页面。 以 任意顺序 返回结果,其中不应当包含重复项。

2 测试用例

输入:

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 已经喜欢了它。

3 解题思路

  1. 查询 user_id = 1 的所有好友信息
SELECT user2_id AS user_id FROM Friendship where user1_id = 1  
UNION ALL  
SELECT user1_id AS user_id FROM Friendship where user2_id = 1

执行结果

+-------+
|user_id|
+-------+
|2      |
|3      |
|4      |
|6      |
+-------+
  1. 查询 user_id = 1 的所有好友喜欢的 page_id
select distinct page_id as recommended_page  
from Likes  
where user_id in (SELECT user2_id AS user_id FROM Friendship where user1_id = 1  
                  UNION ALL  
                  SELECT user1_id AS user_id FROM Friendship where user2_id = 1)

执行结果

+----------------+
|recommended_page|
+----------------+
|23              |
|24              |
|56              |
|33              |
|77              |
|88              |
+----------------+
  1. 排查 user_id = 1 喜欢的 page_id
select distinct page_id as recommended_page  
from Likes  
where user_id in (SELECT user2_id AS user_id FROM Friendship where user1_id = 1  
                  UNION ALL  
                  SELECT user1_id AS user_id FROM Friendship where user2_id = 1)  
  and page_id not in (select page_id from Likes where user_id = 1)

执行结果

+----------------+
|recommended_page|
+----------------+
|23              |
|24              |
|56              |
|33              |
|77              |
+----------------+