带有GROUP BY的MySQL MAX()

时间:2013-10-10 13:13:36

标签: mysql sql

考虑这些条目:

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个条目,我只想返回最新的条目(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列的错误结果!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

一种替代方法,可以避免利用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