2012-02-05 57 views
0

我有一个查询,检索在线用户和用户的朋友。现在我想知道结合这两者的最佳方式,以便我可以获得在线用户朋友的结果。MYSQL结合两个查询来获得功能

朋友查询:

SELECT 
     CASE WHEN userID=$session 
     THEN userID2 
     ELSE userID 
     END AS friendID 
FROM friends 
WHERE userID=$id OR userID2=$session 
LIMIT 18 

用户在线:

SELECT * 
FROM usersActivity 
WHERE setActivity!=3 
AND userID!=$session 

usersActivity.userID需要匹配friendID

+0

直到您指出“朋友”和“使用行为”表格如何链接,才能做到。 – 2012-02-05 17:51:29

+0

usersActivity.userID需要匹配friendID – 2012-02-05 17:52:45

+0

作为列表还是计数?给我你的用例。 – iLLin 2012-02-05 18:02:16

回答

1

查询应该是:

SELECT users.name 
FROM usersActivity 
INNER JOIN friends ON 
    (usersActivity.userID = usersActivity.userID AND usersActivity.userID2 = $session) OR 
    (usersActivity.userID2 = usersActivity.userID AND usersActivity.userID = $session) 
INNER JOIN users ON 
    (usersActivity.userID = users.userID) OR 
    (usersActivity.userID2 = users.userID) 
WHERE usersActivity.setActivity!=3 
    AND usersActivity.userID!=$session 
    AND users.userID != $session 
GROUP BY users.id 

您可以使用COUNT(user.id),如果你希望只算用户。或者选择所有的名字(将它们存储起来供以后在列表中使用),并且仅使用mysql_num_rows()来获得实际的在线朋友数量

0

我想我明白你的后:

SELECT userID FROM usersActivity 
    WHERE setActivity !=3 
    AND userID IN(
    (SELECT userID FROM friends WHERE userID2=$id) 
); 

这假设你有两行你的朋友链接表和$id是当前登录的用户。

userID userID2 
1  2 
2  1 

在你的where语句中使用子查询应该合并这个。不知道这是否会更快,取决于你如何做事情,如此描述它。您可以加入您的用户表,获取朋友姓名信息以及您需要的其他信息。

+0

我的设置只有一行友谊,而不是两个。哪一个是我的case子句在获取friendID – 2012-02-05 18:20:38

+0

中起作用的地方你可以修改子查询,这只是一个例子,可以帮助你找到你需要的地方。将您的CASE添加到子查询中的哪个位置。 – iLLin 2012-02-05 18:22:11

+0

另外,出于性能原因,您可能需要考虑将行数加倍。 – iLLin 2012-02-05 18:22:54