返回介绍

solution / 1200-1299 / 1264.Page Recommendations / README

发布于 2024-06-17 01:03:21 字数 3007 浏览 0 评论 0 收藏 0

1264. 页面推荐

English Version

题目描述

朋友关系列表: 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 已经喜欢了它。

解法

方法一:合并 + 等值连接 + 子查询

我们先查出所有与 user_id = 1 的用户是朋友的用户,记录在 T 表中,然后再查出所有在 T 表中的用户喜欢的页面,最后排除掉 user_id = 1 喜欢的页面即可。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT user1_id AS user_id FROM Friendship WHERE user2_id = 1
    UNION
    SELECT user2_id AS user_id FROM Friendship WHERE user1_id = 1
  )
SELECT DISTINCT page_id AS recommended_page
FROM
  T
  JOIN Likes USING (user_id)
WHERE page_id NOT IN (SELECT page_id FROM Likes WHERE user_id = 1);

方法二

# Write your MySQL query statement below
SELECT DISTINCT page_id AS recommended_page
FROM Likes
WHERE
  user_id IN (
    SELECT user1_id AS user_id FROM Friendship WHERE user2_id = 1
    UNION ALL
    SELECT user2_id AS user_id FROM Friendship WHERE user1_id = 1
  )
  AND page_id NOT IN (SELECT page_id FROM Likes WHERE user_id = 1);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文