こんにちは、ユーザーとフレンドの 2 つのテーブルがあります (friend_status = 1 はリクエストが送信されたことを意味し、friend_status = 2 は彼らがフレンドであることを意味します)。今、すべてのユーザーが特定のユーザーの友達ではないことを選択したいと思います。実行する方法?
現在のユーザーが1であると仮定します。このSQLを試しました。動作しますが、長すぎて遅いです。1 つ目は、user1 に要求を送信したが受け入れられなかったすべてのユーザーを選択します。2 番目は、すべてのユーザーが user1 から要求を受信することを選択します。3 番目と 4 番目は、「友達」テーブルにないすべてのユーザーを選択します。
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
UNION
SELECT u.user_id, u.name, u.email
FROM users u LEFT JOIN friends f ON u.user_id = f.sender
WHERE f.receiver IS NULL
GROUP BY user_id
UNION
SELECT u.user_id, u.name, u.email
FROM users u LEFT JOIN friends f ON u.user_id = f.receiver
WHERE f.sender IS NULL
GROUP BY user_id
) T
GROUP BY user_id
更新:写真を追加します。