2014-12-31 2 views
1

Моя MYSQL таблица имеет следующую структуру:заказа в порядке, не используя событий

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

Когда пользователь находится на сайте, я выполнить AJAX запрос, который обновляет last_act поле и устанавливает user_is_online истина в таблице каждые 30 секунд. Используя локальную машину, я могу включить событие, которое изменит значение user_is_online на false, когда NOW() - last_act > 30. Это используется, чтобы распечатать всех друзей по их статусу. Однако мне также необходимо заказать пользователей по их 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, и здесь я получаю проблему с печатью пользователей в нужном порядке.

Моя идея, что я должен заменить user_is_online = 1/0NOW() - c_last_act < 30 в моих запросах, но это хорошее решение? Может быть, есть более эффективные?

+1

Если у вас есть указатель на 'last_act', то он должен быть эффективным. Используйте 'c_last_act> NOW() - INTERVAL 30 second'. – Barmar

ответ

1

Обратите внимание, что вы можете сделать это в одном запросе, используя ГДЕ как САЙТ САЙТА; он будет фильтровать вверх все те, в которых они находятся в сети, и продолжать работу с теми, которые находятся в автономном режиме:

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

Почему я не думал о заказе с помощью 'user_is_online' замены? Спасибо за отличный ответ, теперь он работает как шарм – lolbas

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' 

сделал то, что я хочу.

Кроме того, я заметил, что использование запроса NOW() в запросе PHP дало мне некоторые нечетные результаты, так как время сервера не настроено на GMT.

+1

Еще одно примечание: теперь он находится в списке пользователей, которые были последними в сети ТОЧНО 30 секунд назад исчезнут из списка. Это вызовет странные сбои. Вы должны добавить знак равенства в один из двух запросов. – Erik

+0

@ Erik хорошая точка, спасибо :) – lolbas

Смежные вопросы