Tables:
users friends
+-------+----+ +-----+-----+
| name | id | | id1 | id2 |
+-------+----+ +-----+-----+
| user1 | 1 | | 1 | 2 |
+-------+----+ +-----+-----+
| user2 + 2 |
+-------+----+
在我的数据库中,friends
表中id1
是主列,这意味着如果id1 = 1
和id2 = 2
那么user1
是user2
的朋友,但不是相反。
我正在尝试从users
表中选择所有没有X
的用户,这些用户friends
中没有id1
。这是因为我不希望userX
能够找到他已经添加的朋友。
这是我失败的尝试:
SELECT * FROM users LEFT JOIN friends ON users.id != friends.id2 WHERE friends.id1 = X AND users.id != X;
我添加了users.id != X
,因为我们不想在搜索其他用户时返回用户本人。
您可以使用外部连接来执行此操作,您尝试进入正确的方向:
select u.*
from users u
left join friends f
on u.id = f.id2
where f.id1 is null
外部联接至少为每个不匹配的项目返回NULL
。
使用not in()
(比mysql中的not exists()
更有效(
select *
from users
where id != xi
and id not in (
select id.2
from friends
where friends.id1 = x
)
使用not exists()
select *
from users
where id != x
and not exists (
select 1
from friends
where friends.id1 = x
and friends.id2 = users.id
)