2010-11-04 35 views
1

我有一个查询,通过加入朋友和用户表的检索结果来检索用户拥有的每个朋友的姓名。我有另一个存储活动用户的表格。我需要找回那些活跃而不活跃的朋友,但由于某种原因,我正在画空白。如果我有一个所有朋友的列表和一个活跃的朋友列表,我可以减去所有离开的离线活动吗?我想要做的基本上都有两个选项卡。下一个会脱机的朋友。其他将在网上的朋友。如果有人有任何有用的建议,我将不胜感激。删除出现在另一个查询中的1个查询的结果

$sql = 'SELECT * FROM users 
LEFT JOIN friendships 
ON friendships.friend_id = users.id 
WHERE friendships.user_id = ?'; 
$stmt5 = $conn->prepare($sql); 
$result=$stmt5->execute(array($userid)); 

$count=$stmt5->rowCount(); 

//user has more than 0 friends 
if ($count>0){ 
    while ($row = $stmt5->fetch(PDO::FETCH_ASSOC)) { 
    $online=htmlspecialchars($row['username'], ENT_NOQUOTES, 'UTF-8'); 
//check whos online 
$sql = 'SELECT * FROM active_users 
WHERE username=?'; 
$stmt7 = $conn->prepare($sql); 
$result=$stmt7->execute(array($online)); 

$count=$stmt7->rowCount(); 
while ($row = $stmt7->fetch(PDO::FETCH_ASSOC)) { 
$activeuser=$row['username']; 
} 
} 

该代码只是检索活动用户,但希望给出一个结构的想法。

回答

3

你可以做一个“不在”条款吗?不知道你的数据库的布局,我想这样的事情:

SELECT * FROM users 
LEFT JOIN friendships 
ON friendships.friend_id = users.id 
WHERE friendships.user_id = ? 
AND users.id NOT IN (
    SELECT user_id FROM active_users 
) 
+0

同意。没有理由在这里做两个单独的查询。 – 2010-11-04 04:57:17

+0

我甚至不知道有这样的事情,谢谢你们 – Scarface 2010-11-04 18:34:37

0

使用SQL来做到这一点'不在'可能是最好的解决方案。

如果您确实想要结果排序,您也可以在代码中执行此操作。只需循环遍历所有用户列表,从活动用户列表中获取第一个结果,并且每当有匹配时,就将其放在活动用户列表中并获取下一个活动用户。将每个不匹配的内容放入非活动用户列表中,并仅从所有用户列表中提取。

像这样的东西可能会告诉你这两个列表中的一个镜头:

SELECT users.username, active_users.username AS active FROM users 
LEFT JOIN friendships 
ON friendships.friend_id = users.id 
LEFT JOIN active_users ON users.username = active_users.username 
WHERE friendships.user_id = ? 

不活跃的用户将会在活动列返回NULL,其中活跃不会。

相关问题