mysql - 选择用户的非朋友的 MySQL 查询
问题描述
我有以下 Mysql 数据库架构:
User(Id, FirstName, LastName, NickName, Etc.)
Request(SenderId, ReceiverId)
Friendship(Id1, Id2)
我认为友谊是一种无向关系,这意味着对于每个友谊,我将它两次插入到友谊表中。(如果这不是一个好主意,请告诉我)。
我要检索的是一个用户列表,这些用户不是特定用户的朋友(让我将他命名为 UserX),也没有当前的请求正在进行中。
我最初的试验导致我这样做:
SELECT User.Id, User.NickName, User.Picture FROM User
LEFT JOIN Friendship A ON User.Id = A.Id1
LEFT JOIN Friendship B ON User.Id = B.Id2
LEFT JOIN Request C ON User.Id = C.Sender
LEFT JOIN Request D ON User.Id = D.Reciever
WHERE User.Id <> ?
而且,占位符当然是 UserX 的 ID。
这不起作用,因为尽管与 UserX 有友谊或请求的元组被消除了,但朋友仍然出现,因为他们与其他用户有友谊!
提前致谢。
解决方案
使用左连接到联合列表:
select *
from User u1
left join
(
select ID2 as id
from Friendships
where ID1 = 'UserX'
union all
select ID1
from Friendships
where ID2 = 'UserX'
union all
select Sender
from Request
where Receiver = 'UserX'
union all
select Receiver
from Request
where Sender = 'UserX'
) ux
on ux.id = u1.id
where ux.id is null
and ux.id <> 'UserX'
推荐阅读
- django - How to make filter Using multiple data value using Django Rest Framework and Angular 11
- c# - 从 Roslyn 代码分析器调用分析程序集的方法
- java - 将字符串转换为 datePicker 格式
- c# - linq中多列表的模型绑定
- android - Jetpack Compose 状态栏颜色未在深色主题中更新
- java - Enable TLS in soapui
- python - Python ctypes LoadLibrary: does it really load a new instance, e.g. so different global variables?
- php - Check if migration exists in Laravel package service provider
- flutter - 我如何四舍五入这些数字以获得想要的结果
- php - 如何根据运输方式更改 woocommerce 运费?