当前位置: 首页 > article >正文

LeetCode_sql_day30(1264.页面推荐)

描述  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 的朋友

提供两种方法 

第一种union 

select user2_id
                  from Friendship
                  where user1_id = 1
                  union
                  select user1_id
                  from Friendship
                  where user2_id = 1

第二种case when

select case
    when user1_id = 1 then user2_id
    when user2_id = 1 then user1_id end friends
from Friendship

② 查询Likes表 条件user_id要在第①问所得出的表种 同时 还不能包括自己(user_id=1)的

select distinct page_id
from Likes
where user_id in (select user2_id
                  from Friendship
                  where user1_id = 1
                  union
                  select user1_id
                  from Friendship
                  where user2_id = 1)
  and page_id not in (select page_id from Likes where user_id = 1

代码

# 法一
select distinct page_id
from Likes
where user_id in (select user2_id
                  from Friendship
                  where user1_id = 1
                  union
                  select user1_id
                  from Friendship
                  where user2_id = 1)
  and page_id not in (select page_id from Likes where user_id = 1);

#法二
select distinct page_id
from Likes
where user_id in (select case
                             when user1_id = 1 then user2_id
                             when user2_id = 1 then user1_id end friends
                  from Friendship)
  and page_id not in (select page_id from Likes where user_id = 1);

总结

case when 的用法 很奇妙 可以积累一下

遇到涉及到两列的数据 可以考虑使用union  和 case  when


http://www.kler.cn/news/317968.html

相关文章:

  • 蓝桥等考C++组-2022-11-27-八级
  • 【C++】C++中如何处理多返回值
  • Vue|插件
  • oracle avg、count、max、min、sum、having、any、all、nvl的用法
  • 回答网友的一个SQL问题
  • 国家有要求企业一定要招实习生吗?或者说招了实习生国家会给企业好处吗?
  • IPv6(五)
  • 探索自闭症寄宿学校:为孩子的未来铺设坚实基石
  • 进程监控与管理详解
  • 若依VUE项目安全kind-of postcss vite漏洞扫描和修复
  • 小阿轩yx-案例:Ansible剧本文件实践
  • 滚雪球学SpringCloud[6.1讲]: Spring Cloud Sleuth详解
  • 【Git】远程仓库
  • 数据库中的DUAL表
  • consul注册中心与容器自动发现实战
  • 芯片开发(1)---BQ76905---底层参数配置
  • 【算法】leetcode热题--148.排序链表
  • 仿黑神话悟空跑动-脚下波纹特效(键盘wasd控制走动)
  • 【云原生安全篇】一文掌握Harbor集成Trivy应用实践
  • Eclipse如何调整编辑器中的字体大小?
  • 科研绘图系列:R语言误差连线图(errobar linechart)
  • dockerfile 添加arthas 监控插件。容器添加arthas监控
  • 哪款品牌充电宝性价比比较高?五款性价比绝佳充电宝推荐
  • java反射的应用场景与限制
  • 记软件开发者画图(UML),使用WPS应用制图
  • 如何使用ssm实现基于ssm框架的车辆出租管理系统+vue
  • 前端——JavaScript综合练习 下拉框样式实现(2)
  • 110Redis 简明教程--Redis 数据类型
  • 手写Spring第三篇,原来Spring容器是使用反射来初始化对象的
  • 考前须知:Oracle OCP考试流程和准备