2013-10-10 2 views
0

Учитывая эти записи:MySQL MAX() с GROUP BY

INSERT INTO `schedule_hours` (`id`, `weekday`, `start_hour`) VALUES 
(1, 1, '09:00:00'), 
(2, 2, '09:00:00'), 
(3, 3, '09:00:00'), 
(4, 4, '09:00:00'), 
(5, 5, '09:00:00'), 
(6, 6, NULL), 
(7, 7, NULL), 
(8, 1, '12:00:00'); 

Я бегу следующий запрос:

SELECT MAX(id), weekday, start_hour 
FROM schedule_hours 
GROUP BY weekday 
ORDER BY weekday 

Цель состоит в том, чтобы получить целую неделю (день недели 1-понедельник, 2-й день и т. Д.), Но верните последние записи.

Итак, в моем столе у ​​меня теперь есть 2 записей для понедельника и 1 вход для остальной части дня, я только хочу, чтобы вернуть последние из них (идентификатора является полем приращения), правый результат должен быть:

8 1 12:00:00 
2 2 09:00:00 
3 3 09:00:00 
4 4 09:00:00 
5 5 09:00:00 
6 6 NULL 
7 7 NULL 

Что я сейчас получаю:

8 1 09:00:00 < wrong 
2 2 09:00:00 
3 3 09:00:00 
4 4 09:00:00 
5 5 09:00:00 
6 6 NULL 
7 7 NULL 

идентификатор и будний столбцы являются правильными, но первая строка показывает неправильный результат для столбца START_HOUR!

+1

Это происходит потому, что в MySQL 'GROUP BY' отстой. – Kermit

+1

@FreshPrinceOfSO Ну, тот факт, что OP не получил * ошибку *, заключается в том, что MySQL «GROUP BY» отстой. – IMSoP

+0

Этот вопрос задан несколько раз в день. – Strawberry

ответ

3

Вы должны попробовать этот запрос:

SELECT id, weekday, start_hour 
FROM schedule_hours 
WHERE id IN (
    SELECT MAX(id) 
    FROM schedule_hours 
    GROUP BY weekday 
    ) 
ORDER BY weekday 

В настоящее время в запросе столбцы в SELECT пункте отличаются от колонок в GROUP BY пункте. В стандартном SQL ваш запрос является незаконным и приведет к синтаксической ошибке. Тем не менее, MySQL расширяет использование GROUP BY, так что список выбора может ссылаться на неагрегированные столбцы, не названные в предложении GROUP BY, поэтому вы не получаете ошибку, но результат не является тем, что вы ожидаете. Для получения дополнительной информации вы можете прочитать MySQL Extensions to GROUP BY.

+2

Прекратите это делать. Вы не должны указывать столбец в 'GROUP BY', который не находится в вашем списке SELECT – Kermit

+0

Ну, это сработало. Приветствия Азиза. –

+0

@JorgAncrath Удача в использовании плохих практик. – Kermit

1

Альтернативой который избегает воспользовавшись MySQL позволяя GROUP BY поля, которое не находится в ЗЕЬЕСТ: -

SELECT schedule_hours.id, schedule_hours.weekday, schedule_hours.start_hour 
FROM schedule_hours 
INNER JOIN 
(
    SELECT weekday, MAX(id) AS MaxId 
    FROM schedule_hours 
    GROUP BY weekday 
)Sub1 
ON schedule_hours.id = Sub1.MaxId 
AND schedule_hours.weekday = Sub1.weekday 
ORDER BY schedule_hours.weekday