簡體   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