2010-10-24 67 views
1

我想列出一个列表来显示用户的在线朋友。PHP:一次选择和过滤两个表格

users 
id | firstname | lastname | last_access 

users_friends 
uID | bID | type | accepted 

这是我tabels什么样子。

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

$ USER的id存储在users_friends的“uID”列的一行中。 bID是朋友的ID。

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

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

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

自上次访问以来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's名($ USER)显示。但echo bid是我朋友的正确身份证,尽管它显示了所有(不过滤掉那些在线的人)。

我该怎么做,我错过了什么?

回答

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,反之亦然。

1

我认为你缺少指定用户和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' 
"); 
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' 
之间的关系