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