gpt4 book ai didi

选择用户的非好友的 MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 06:31:04 24 4
gpt4 key购买 nike

我有以下 Mysql 数据库架构:

User(Id, FirstName, LastName, NickName, Etc.)
Request(SenderId, ReceiverId)
Friendship(Id1, Id2)

我认为友谊是一种无向关系,这意味着对于每一个友谊,我都会将其插入友谊表两次。 (如果这不是一个好主意,请告诉我)。

我试图检索的是一个用户列表,这些用户不是特定用户(让我将他命名为 UserX)的 friend ,也没有当前向他发出的请求。

我最初的尝试导致我这样做:

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 有友谊或请求的元组被消除,但 friend 仍然会出现,因为他们与其他用户有友谊!

提前致谢。

最佳答案

如果您想要一个有效的解决方案,请多次使用不存在:

select u.*
from user u
where not exists (select 1 from friendship f where f.id1 = u.id and f.id2 = ?) and
not exists (select 1 from friendship f where f.id2 = u.id and f.id1 = ?) and
not exists (select 1 from request r where r.SenderId = u.id and r.ReceiverId = ?) and
not exists (select 1 from request r where r.ReceiverId = u.id and r.SenderId = ?);

特别是,这可以利用以下索引:

  • 友谊(id1,id2)
  • 友谊(id2,id1)
  • 请求(SenderId,ReceiverId)
  • 请求(ReceiverId,SenderId)

这应该比联合子查询在一起的解决方案具有更好的性能。

关于选择用户的非好友的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56257374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com