0

考虑这些条目:

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 列的结果错误!

4

2 回答 2

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

于 2013-10-10T13:18:07.100 回答
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
于 2013-10-10T15:19:59.967 回答