你们可以告诉我如何在顶部和所有离线状态下显示所有在线人员,两个列表都按照用户名的升序排列。
我的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;
一些帮助将非常感激。
答案 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