Если вы сгруппировали по HOUR(time)
, то в выражениях выбора следует использовать HOUR(time)
, а не time
. Например:
SELECT HOUR(time), COUNT(*)
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(time)
ORDER BY HOUR(time)
В качестве альтернативы вы можете группировать по выражению, которое хотите вернуть:
SELECT COUNT(*), FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
ORDER BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
В случае, если вам интересно, можно безопасно вызывать NOW()
несколько раз в одном и том же запросе, как этот. Из руководства :
Функции, которые возвращают текущую дату или время, каждая оценивается только один раз для запроса в начале выполнения запроса. Это означает, что несколько ссылок на такую функцию, как NOW () в одном запросе, всегда приводят к одному и тому же результату.