我的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_rank
按user_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 时间。