在MySQL 中分組之前按日期和時間對記錄進行排序
處理包含時間戳的表時,必須根據時間戳檢索資訊具體時間範圍。然而,在按特定欄位對記錄進行分組之前按日期和時間排序可能會對 MySQL 造成挑戰。
考慮下表:
name date time tom | 2011-07-04 | 01:09:52 tom | 2011-07-04 | 01:09:52 mad | 2011-07-04 | 02:10:53 mad | 2009-06-03 | 00:01:01
要檢索按名稱分組的最舊記錄,以下查詢將失敗:
SELECT * ORDER BY date ASC, time ASC GROUP BY name
此查詢不起作用,因為GROUP BY 必須出現在ORDER BY 之前。然而,在排序之前進行分組會導致首先傳回較新的「瘋狂」記錄,而不是較舊的記錄。
要解決此問題,有多種方法可用:
子查詢方法:
SELECT * FROM ( SELECT * FROM table_name ORDER BY date ASC, time ASC ) AS sub GROUP BY name
此方法建立一個子查詢,按查詢日期和時間對記錄進行排序,然後將結果傳遞到外部查詢以按名稱分組。由於 GROUP BY 會對子查詢中的第一個符合記錄進行操作,因此它會檢索每個名稱的最舊記錄。
ROW_NUMBER() 方法:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date, time) AS row_num FROM table_name ) AS sub WHERE row_num = 1
ROW_NUMBER( ) 為每個名稱分區中的每一行分配一個序號,並按日期和時間排序。僅選擇 row_num = 1 的記錄,將選擇每個名稱的最舊記錄。
MAX() 子查詢方法:
SELECT * FROM table_name WHERE (date, time) IN ( SELECT MAX(date) AS date, MAX(time) AS time FROM table_name GROUP BY name )
此查詢使用子查詢為每個名稱選擇最大日期和時間。透過根據這些值過濾主查詢,它會檢索每個名稱的最舊記錄。
以上是如何在 MySQL 中分組之前按日期和時間對記錄進行排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!