我有一个查询,通过加入朋友和用户表格来检索用户拥有的每个朋友的名字。我有另一个存储活动用户的表。我需要检索活跃且不活跃的朋友,但出于某种原因,我正在画一个空白。如果我有一个所有朋友的列表和一个活跃的朋友列表,我可以从所有人中扣除活动以离线吗?我想要做的就是有两个标签。下一个将是离线的朋友。另外将是网友。如果有人有任何有用的建议,我将不胜感激。
$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'];
}
}
此代码只检索活跃用户,但希望能够了解结构。
答案 0 :(得分: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
)
答案 1 :(得分: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,而活动列则不会返回NULL。