嗨,我有这两个表:用户和朋友(friend_status = 1表示请求已发送,friend_status = 2表示他们是朋友)。现在我想选择所有用户都不是任何人的朋友。怎么做?
假设当前用户是1.我试过这个,但似乎是错误的。因为它只显示发送请求但尚未确认的用户。
SELECT user_id, name, email
FROM
(
SELECT user_id, name, email
FROM users u INNER JOIN friends f ON u.user_id = f.sender
WHERE f.receiver = 1 AND friend_status <> 2
UNION
SELECT user_id, name, email
FROM users u INNER JOIN friends f ON u.user_id = f.receiver
WHERE f.sender = 1 AND friend_status <> 2
) T
LIMIT 0, 10
答案 0 :(得分:4)
SELECT
a.user_id,
a.name,
a.email
FROM
users a
LEFT JOIN
friends b ON
a.user_id IN (b.sender, b.receiver) AND
b.friend_status = 2
WHERE
b.friend_id IS NULL
在这里,我们想要LEFT JOIN
users
和friends
表,条件是用户已发送或接收请求并且已接受友谊。如果用户未同时遇到这两个标准,则联接的friends
表中的值将为NULL
。
现在我们希望 没有 的用户符合加入条件,因此我们会使用WHERE b.friend_id IS NULL
筛选出符合条件的用户,选择朋友表中没有任何相应条目的用户(在发件人/收件人字段中) 或 具有相应的条目 BUT 他们都没有friend_status
2
。
答案 1 :(得分:2)
另一种解决方案。请注意,这可能不如Zane的解决方案那么好,但它确实具有不那么神秘的优势:
SELECT * FROM users AS u
WHERE NOT EXISTS(
SELECT * FROM friends
WHERE friend_status = 2
AND (sender = u.user_id OR receiver = u.user_id)
);
应该足够简单易读:它选择每个没有入境或出境朋友关系的用户。
答案 2 :(得分:0)
SELECT user_id,name,email
FROM users
WHERE user_id NOT IN (
SELECT sender FROM friends WHERE friend_status<>2
UNION
SELECT receiever FROM friends WHERE friend_status<>2
)
如果有人能发布比这更优化的解决方案,我希望看到它!
答案 3 :(得分:0)
所有没有朋友的用户?
SELECT * FROM users
WHERE user_id NOT IN(SELECT sender FROM friends WHERE friend_status=2)
AND user_id NOT IN(SELECT receiver FROM friends WHERE friend_status=2)
答案 4 :(得分:0)
试试这个
U.User_ID,u.Name
From Users AS U
Where User_ID NOT IN
(Select Sender From Friends Where Status=2) AND User_ID NOT IN
(Select Receiver From Friends Where Status=2)