繁体   English   中英

MySQL MAX()与GROUP BY

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM