目录
题目链接
题目:链接!!!
题目和要求
朋友关系列表: 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 已经喜欢了它。
问题
我先提出问题,您往下面看,就知道奇怪了
问题:把数据换成 测试用例后,子查询改为cte表达式结果就不对了,以及改为cte表达式后去掉where条件结果又对了
1
这是一周以前我发现了,事情是这样的一开始我是用的if( , , if( , , null))
加cet表达式写的
with a1 as (
select
if(user1_id=1,user2_id,if(user2_id=1,user1_id,null)) as id
from Friendship
where user1_id=1 or user2_id=1)
-- 上面是cte表达式
select distinct page_id recommended_page
from Likes
where user_id in (select id from a1) and page_id not in (select page_id from Likes where user_id=1);
结果错误:
2
然后我反思以为是if( , , if( , , null))
的null
导致的错误了,然后我就换成case when
#with a1 as (
select
if(user1_id=1,user2_id,if(user2_id=1,user1_id,null)) as id
from Friendship
where user1_id=1 or user2_id=1)
-- 上面是cte表达式
#select distinct page_id recommended_page
#from Likes
#where user_id in (select id from a1) and page_id not in (select page_id from #Likes where user_id=1);
#####################################################
with a1 as (
select CASE
WHEN user1_id = 1 then user2_id
WHEN user2_id = 1 then user1_id END AS id
-- 我把if( , , if( , , null))改为cet表达式
from Friendship where user1_id=1 or user2_id=1)
-- 上面是cte表达式
SELECT distinct page_id as recommended_page
from Likes
where user_id in
-- !!!!!!!!!!!
( select id from a1 )
-- !!!!!!!!!!!!!!!
and page_id not in (select page_id from Likes where user_id=1);
3
结果还是没通过
4当时我人就麻了,因为我非常相信我的思路没有问题
当时我人就麻了,因为我非常相信我的思路没有问题
然后我直接看官方的答案
5
运行一下官方的竟然能通过(当时我就产生了疑问为什么官方不用CTE了,这样板书不是更直观,更好看吗
)
6 然后我就开始怀疑是力扣解释器的问题
我就把没通过的测试用例,导入dataGrip 2024.2.2 软件中进行操作
drop table Friendship;
drop table Likes;
Create table If Not Exists Friendship (user1_id int, user2_id int);
Create table If Not Exists Likes (user_id int, page_id int);
-- 插入 Friendship 表的数据
INSERT INTO Friendship (user1_id, user2_id) VALUES
(1, 2),
(2, 4),
(2, 5),
(3, 4),
(3, 6);
-- 插入 Likes 表的数据
INSERT INTO Likes (user_id, page_id) VALUES
(2, 19),
(2, 11),
(2, 10),
(3, 14),
(3, 10),
(3, 13),
(3, 11),
(4, 12),
(4, 10),
(4, 18),
(4, 19),
(5, 16),
(5, 19),
(5, 18),
(6, 14);
7 发现都可能没有问题
输出后
发现
8
然后我就折腾一下,发现 去掉where结果又一样了
9
问了一下老师,老师也说很奇怪!
10
你不信可以点开下面题目的链接, 去把官方的方法2答案 改为CTE表达式,结果就是通过不了测试示例
题目链接
题目:链接!!!
标签:user2,user1,page,奇怪,Likes,user,1264,id,页面 From: https://blog.csdn.net/weixin_74002941/article/details/143414971