如何在其后显示在线和离线的在线用户?

时间:2016-02-03 13:51:53

标签: php mysql

你们可以告诉我如何在顶部和所有离线状态下显示所有在线人员,两个列表都按照用户名的升序排列。

我的MySQL表是用户,列如下:

ID
Username
Last_logged_in - is with unix_timestamp();

我用来向在线人展示的代码如下:

select * from users where Last_logged_in >= UNIX_TIMESTAMP() - 60;

我试过的代码是这样的:

select id, username,  last_logged_in from users where last_logged_in >= UNIX_TIMESTAMP() - 60 UNION select id, username,  last_logged_in from users where  last_logged_in <= UNIX_TIMESTAMP() - 60 LIMIT 10;

一些帮助将非常感激。

2 个答案:

答案 0 :(得分:2)

  

不需要联合,只需按last_logged_in字段降序排序,因为您使用此字段来计算用户是否已登录:

select * from users order by Last_logged_in desc limit 10;

这样,登录的用户将位于列表的顶部,因为他们最近才登录。

更新

如果您想按用户名订购两个列表,仍然不需要联合,让我们建立在axiac的建议解决方案上:

SELECT u.*, IF(Last_logged_in >= UNIX_TIMESTAMP() - 60, 1, 0) as isOnline;
FROM users u
ORDER BY isOnline DESC, u.Username ASC

答案 1 :(得分:2)

  

您的查询没有提供您期望的结果,因为查询它的联合行中的UNION does not preserve the order行。

您需要将每个联合查询括在括号中,并在最后一次查询后添加ORDER BY。但是,如果您这样做,您将获得一个大而慢的查询,以一种错综复杂的方式从表users中选择所有记录。

解决方案是按列Last_logged_in降序排序。这样,最先登录的用户将首先返回。此外,您还需要在字段列表中添加一个表达式,告诉用户是否仍在线。最后,因为您的查询不会过滤返回的用户,所以建议使用LIMIT子句;否则查询将返回整个表,这可能不是你想要的。

<强>更新

作为comment中指定的OP,用户必须按其在线状态(在线优先)排序,然后按用户名(升序)排序。

(更新的)查询是:

SELECT u.*, IF(Last_logged_in >= UNIX_TIMESTAMP() - 60, 1, 0) as isOnline;
FROM users u
ORDER BY isOnline DESC, username ASC
LIMIT 20