选择用户不是任何人的朋友

时间:2012-06-25 04:09:37

标签: mysql sql

enter image description here

嗨,我有这两个表:用户和朋友(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

5 个答案:

答案 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 usersfriends表,条件是用户已发送或接收请求并且已接受友谊。如果用户未同时遇到这两个标准,则联接的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)