0

在此处输入图像描述

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

5 回答 5

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用户,这将选择在朋友表中没有任何对应条目的用户(在发送者/接收者字段中)有相应的条目,没有一个具有friend_statusof 2

于 2012-06-25T04:19:32.913 回答
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)
  );

应该足够简单易读:它选择没有任何入站或出站朋友关系的每个用户。

于 2012-06-25T04:25:37.917 回答
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
)

如果有人可以发布比这更优化的解决方案,我很想看看!

于 2012-06-25T04:25:07.037 回答
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)
于 2012-06-25T04:25:25.473 回答
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)
于 2012-06-25T04:37:15.027 回答