MYSQL Group к концу года перестал работать - PullRequest
0 голосов
/ 07 марта 2012

У меня проблемы с некоторыми MYSQL.Приведенный ниже код работал нормально до недели или две назад, когда он начал группировать что-то более новое, чем 21 февраля 2012 года.Первая запись была 18 сентября 2011 года, поэтому она не выполнялась целый год.

SELECT dept, time, COUNT(*) AS freq
FROM prefix_table1 a
INNER JOIN prefix_table2 b b ON a.author = b.username
GROUP BY WEEKOFYEAR(DATE(FROM_UNIXTIME(time)))
ORDER BY time ASC
LIMIT 24 

Все, чего я хочу добиться с помощью этого запроса, - это получить количество записей, которые произошли за каждую неделю.

Как только у меня есть это, я обрабатываю штамп UNIX в PHP, чтобы получить номер недели в году и добавить к нему суффикс, чтобы позволить статистике работать более 12 месяцев.

Вопросэто - где я ошибся?Почему он перестал работать с 21 февраля 2012 года?

1 Ответ

2 голосов
/ 07 марта 2012

Проблема в том, что вы группируете набор полей, отличающийся от выбранного. Этот запрос просто сработал случайно. Я имею в виду, вы группировали по WEEKOFYEAR и выбирали значение времени. Что фактически делает группировка, так это «удаляет» детали и создает группу, в которой они применяют функцию (в данном случае это количество).

Теперь вы пытаетесь показать детали при группировании одновременно, и это приводит к неправильному запросу. Например, это будет работать, но не покажет вам детали:

SELECT dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) as aWeek, COUNT(*) AS freq
FROM prefix_table1 a
INNER JOIN prefix_table2 b b ON a.author = b.username
GROUP BY dept, aWeek
ORDER BY aWeek
LIMIT 24

Яркий пример неправильной логики вашего исходного запроса: если вы сгруппировали, скажем, 20 записей (на счетчике будет отображаться 20) ... какое время вы бы отобразили для ВСЕХ из них, если вы можете отображать только 1 из этих записей?

Edit:

Как сказал @ypercube, предыдущий запрос может не работать в зависимости от того, заставляете ли вы сервер соблюдать стандарты ANSI или нет. Если это так, то вы можете попробовать выполнить следующий (и немного недружественный) запрос:

SELECT dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) as aWeek, COUNT(*) AS freq
FROM prefix_table1 a
INNER JOIN prefix_table2 b b ON a.author = b.username
GROUP BY dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time)))
ORDER BY aWeek
LIMIT 24
...