0

我已经编写了一个 MySQL 查询需要做什么的示例,我曾尝试将这两个查询结合起来,但这样做没有任何成功。基本上,它的作用是选择 $session 已经不是朋友的所有用户。

就我的表结构而言,我不知道我需要解释多少,因为您可以使用下面的查询看到我需要做什么,但基本上我的朋友表对于每个友谊只有一行。(只有当stateis1CASE语句对于从友谊中获取 ID 是必要的时,友谊才有效friends,因为我的表只有一行用于友谊。

$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 回答