考虑这些条目:
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列的错误结果!
答案 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