SELECT
SUM(lastOnline <= 60) AS one_minute,
SUM(lastOnline <= 300) AS five_minutes,
...
SUM(lastOnline <= 30240000) AS one_month
FROM usersonline
Используя этот метод, вы можете получить все необходимое в одном запросе за одно сканирование таблицы; это не становится намного более эффективным, чем это. Как уже упоминалось, вы должны кэшировать результат, так как он относительно дорогой (даже в этой оптимизированной форме). Нет смысла вычислять это при каждой загрузке страницы, особенно если вы видите несколько обращений в секунду (что весьма вероятно, если вы, скажем, нажали первую страницу digg)
lastOnline <= 60 оценивается как 1 для строк, где условие истинно, и 0 для строк, где условие ложно; SUM () суммирует эти 1 и нули, подсчитывая количество строк, для которых выполняется условие. </p>
Изучил эту технику из комментария пользователя в документах mysql несколько лет назад; Есть подобные примеры в других местах