把这个混乱的PHP变成一个MySQL查询

时间:2012-11-11 20:50:58

标签: php mysql sql

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

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

$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)));

1 个答案:

答案 0 :(得分: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上查看。