我有一个表格user
,另外还有INNER JOIN
表格cities
以及其他一些表格。现在我还有下表:
blocked_user
--------------------------------------------------------
id | user1_id | user2_id | timestamp
如何使用LEFT JOIN WHERE IS NULL
,以便从搜索结果中排除两个用户组合(user1阻止user2或user2阻止user1)?
user
--------------------------------------------------------
id | username | ...
非常感谢您的帮助!
答案 0 :(得分:2)
在这种情况下,我想关键字NOT EXISTS至少在语义上是合适的。
SELECT * FROM user u
WHERE NOT EXISTS (
SELECT * FROM blocked_user b
WHERE
b.user1_id = u.id
OR b.user2_id = u.id
)
确实可以选择使用:
SELECT * FROM user u LEFT JOIN blocked_user b ON b.user1_id = u.id
OR b.user2_id = u.id
WHERE b.id IS NULL
但是对于表演,我不知道哪一个更有效率。
RGDS。
答案 1 :(得分:2)
我猜你有一个当前用户(正在执行请求的用户),并且你想要隐藏他们阻止的所有用户或阻止他们的所有用户。我还假设user1_id
是阻止用户的用户,user2_id
是他们阻止的用户。您应该编辑您的问题以使这些点更清晰。
如果这是对的,这就是我要做的事情:
SELECT id, username
FROM user
LEFT JOIN (
SELECT DISTINCT user2_id AS blockee_id
FROM blocked_user
WHERE user1_id = :current_user_id
) this_user_blocked
ON user.id = this_user_blocked.blockee_id
LEFT JOIN (
SELECT DISTINCT user1_id AS blocker_id
FROM blocked_user
WHERE user2_id = :current_user_id
) blocked_this_user
ON user.id = blocked_this_user.blocker_id
WHERE this_user_blocked.blockee_id IS NULL
AND blocked_this_user.blocker_id IS NULL
我认为使用两个单独的LEFT JOIN ... WHERE ... IS NULL
构造是有意义的,因为你确实在检查两种不同的情况。