如何在 MySQL 中分組之前按日期和時間對記錄進行排序?

Patricia Arquette
發布: 2024-10-30 06:24:28
原創
591 人瀏覽過

How to Sort Records by Date and Time Before Grouping in MySQL?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!