[英]MySQL MAX() with 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
目的是获得整整一周的时间(工作日为周一至周一,周一至周二等),但返回最近的条目。
因此,在我的表中,我现在有2个星期一的条目,其余日子有1个条目,我只想返回最新的(id是一个增量字段),正确的结果应该是:
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
id和weekday列正确,但是第一行显示的start_hour列结果错误!
您应该尝试以下查询:
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对GROUP BY的扩展 。
一种避免使用MySQL允许SELECT语句中没有的字段的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.