按顺序排序,不使用事件


Order in order without using events

我的MYSQL表具有以下结构:

+------+----------+-----+-----------+----------------+----------+
| uuid | username | ... | clan_rank | user_is_online | last_act |
+------+----------+-----+-----------+----------------+----------+

当用户在网站上时,我执行 ajax 请求,该请求每 30 秒更新last_act字段并将表中的user_is_online设置为 true。使用本地机器,我可以启用user_is_online每当NOW() - last_act > 30更改为 false 的事件。这用于打印与其状态相关的所有朋友。但是,我还需要按用户clan_rankuser_is_online排序。使用事件,可以通过以下查询轻松实现此目的:

'SELECT * FROM users WHERE user_is_online = 1 ORDER BY clan_rank DESC'

'SELECT * FROM users WHERE user_is_online = 0 ORDER BY clan_rank DESC'

上面的查询将首先打印所有在线用户并按其氏族等级排序,然后以相同的顺序打印所有离线用户。

但不幸的是,在我的主机上,我无法将Event scheduler status设置为 ON 状态,这就是我遇到按所需顺序打印用户的问题。

的想法是我应该在查询中用NOW() - c_last_act < 30替换user_is_online = 1/0,但这是一个很好的解决方案吗?也许有更有效的?

请注意,您可以使用 WHERE 作为 ORDER 本身在单个查询中执行此操作; 它将过滤到所有在线的顶部,并继续离线的:

SELECT * FROM users ORDER BY ('.time().' - c_last_act < 30) DESC, clan_rank DESC

好的,所以将我当前的查询更改为

'SELECT * FROM users WHERE ('.time().' - c_last_act <= 30) ORDER BY clan_rank DESC'
'SELECT * FROM users WHERE ('.time().' - c_last_act > 30) ORDER BY clan_rank DESC'

做了我想做的事。

此外,我注意到在 PHP 查询中使用 NOW() 给了我一些奇怪的结果,因为服务器时间没有设置为 GMT 时间。