0

ここに画像の説明を入力

こんにちは、ユーザーとフレンドの 2 つのテーブルがあります (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 JOINusersおよびテーブルを取得します。friendsユーザーが両方の基準を満たしていない場合、結合されたfriendsテーブルの値は になりますNULL

ここで、参加基準を満たさなかったユーザーが必要なため、基準を満たしたユーザーを除外しますWHERE b.friend_id IS NULL。これにより、フレンド テーブル (送信者/受信者フィールド) に対応するエントリがないユーザーが選択されます。または、対応するエントリがありますが、いずれも of を持っていませfriend_status2

于 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 に答える