订购时不使用事件

时间:2014-12-31 09:33:59

标签: php mysql

我的MYSQL表具有以下结构:

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

当用户在网站上时,我会执行更新last_act字段的ajax请求,并每隔30秒在表中将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

上面的查询将首先打印所有在线用户并按其部落排名进行排序,然后打印所有具有相同订单的离线用户。

但不幸的是,在我的托管中,我无法将user_is_online = 1/0设置为ON状态,这就是我遇到按所需顺序打印用户的问题。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

'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。