PHP:一次选择并过滤2个表

时间:2010-10-24 13:32:56

标签: php

我想列出一个列表,以显示在线的用户朋友。

users
id | firstname | lastname | last_access

users_friends
uID | bID | type | accepted 

这就是我的表格的样子。

首先,我在$ USER中拥有用户ID。

$ USER的id存储在users_friends中的行“uID”行中。 bID是朋友的身份。

我还需要检查是否接受,如果是1,否则用户正在“等待”并且已经被朋友接受了。

类型也应该检查“朋友”,因为我也有其他类型。

检查它们是否在线:last_access包含unix时间戳。

自上次访问以来

500秒,我在社区中称之为“在线”。

现在这就是你需要知道的全部内容。我自己尝试构建查询并提出了这个问题:

    $query = mysql_query("
       SELECT *
        FROM users u, users_friends uf
        WHERE 
            u.last_access > UNIX_TIMESTAMP()-500 
            AND 
              uf.uID = '$USER' 
            AND
            uf.type = 'friend'
                 AND 
                 uf.accepted = '1'
");

现在我想回应在线朋友的名字和姓氏(来自用户)。

我试了一会儿()

while($get = mysql_fetch_array($query)){
echo $get["bID"]."<br>";
   echo $get["firstname"]."<br>";
}

我显示了自己的用户名($ USER)。但回声bID对我的朋友来说是正确的id,虽然它显示了所有(不过滤掉那些在线的人)。

我怎么能做到这一点,我错过了什么?

3 个答案:

答案 0 :(得分:1)

我认为您缺少指定users和users_friends表之间的关系

$query = mysql_query("
   SELECT *
    FROM users u
    INNER JOIN users_friends uf on u.id=uf.bid
    WHERE 
        u.last_access > UNIX_TIMESTAMP()-500 
        AND 
          uf.uID = '$USER' 
        AND
        uf.type = 'friend'
             AND 
             uf.accepted = '1'
");

答案 1 :(得分:0)

 $query = mysql_query("
   SELECT u.* FROM 
       users AS u
   INNER JOIN
        users_friends AS f
   ON u.id = f.uID
   WHERE 
        u.last_access > UNIX_TIMESTAMP()-500 
        AND 
            f.bID = '$USER' 
        AND
            f.type = 'friend'
        AND 
            f.accepted = '1'
");

这应该会给你的朋友行。请注意使用该$ USER变量的SQL注入。

注意:这将为您提供一个与您成为朋友的人员列表(您在他们的朋友列表中)。如果“友谊”不是双向的,并且您只想查看朋友列表中的朋友,则可以使用f.bID交换f.uID,反之亦然。

答案 2 :(得分:0)

SELECT DISTINCT *
FROM users_friends uf
LEFT JOIN users u ON uf.bID =  u.ID
WHERE uf.uID = $USER
AND u.last_access > UNIX_TIMESTAMP()-500 
AND uf.type = 'friend'
AND uf.accepted = '1'