0

私は、MySQL クエリが何をする必要があるかを正確に示すコードを作成しました。2 つのクエリを結合しようとしましたが、うまくいきませんでした。基本的に、これが行うことは、$session がまだフレンドになっていないすべてのユーザーを選択することです。

以下のクエリを使用して何をする必要があるかを確認できるため、テーブル構造に関する限り、どれだけ説明する必要があるかわかりませんが、基本的に、友人テーブルには友情ごとに 1 つの行しかありません。(私のテーブルには友情の行が 1 つしかないため、友情は、友情から IDを取得するためにステートメントが必要であるstate場合にのみ有効です。1CASEfriends

$getUsers = mysql_query("SELECT id FROM users WHERE id!=$session");
$getFriends = mysql_query("SELECT CASE WHEN userID=$session THEN userID2 ELSE userID END AS friendID 
                                    FROM friends 
                                    WHERE (userID=$session OR userID2=$session) 
                                    AND state='1'");

        $usersArray = array();
        $friendsArray = array();

        while($usersC = mysql_fetch_array($getUsers))
        {
            $usersID = $usersC['id'];
            array_push($usersArray, $usersID);
        }
        while($usersF = mysql_fetch_array($getFriends))
        {
            $friendID = $usersF['friendID'];
            array_push($friendsArray, $friendID);   
        }

        print_r(array_merge(array_diff($usersArray, $friendsArray), array_diff($friendsArray, $usersArray)));
4

1 に答える 1

4

NULL外部結合と、結合されたテーブルが次のレコードのフィルターを介して影響を与えることができるアンチ結合が必要です。

SELECT users.id
FROM   users LEFT JOIN friends f
    ON (f.userID = $session AND f.userID2 = users.id AND f.state='1')
    OR (f.userID = users.id AND f.userID2 = $session AND f.state='1')
WHERE   f.userID IS NULL    AND f.userID2 IS NULL
   AND users.id <> $session

sqlfiddleで参照してください。

于 2012-11-11T20:58:40.227 に答える