首页 > 解决方案 > 选择用户的非朋友的 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 有友谊或请求的元组被消除了,但朋友仍然出现,因为他们与其他用户有友谊!

提前致谢。

标签: mysqlsqlsocial-network-friendship

解决方案


使用左连接到联合列表:

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'

推荐阅读