首頁 > 資料庫 > mysql教程 > 如何使用MySQL中每個家庭的Max DateTime選擇行?

如何使用MySQL中每個家庭的Max DateTime選擇行?

Linda Hamilton
發布: 2025-01-25 06:38:09
原創
245 人瀏覽過

How to SELECT Rows with the MAX Datetime for Each Home in MySQL?

MySQL:為每個群組選擇具有最大日期時間的行

本指南示範如何有效率地擷取包含 MySQL 表中每個不同群組的最大日期時間值的行。 這是一個常見的 SQL 挑戰,通常涉及子查詢或視窗函數。

場景:

想像一個表格 (TopTen) 追蹤不同家庭的玩家資源使用:

<code class="language-sql">CREATE TABLE TopTen (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  home INT UNSIGNED NOT NULL,
  datetime DATETIME NOT NULL,
  player VARCHAR(6) NOT NULL,
  resource INT NOT NULL
);</code>
登入後複製

目標是為每個 home 尋找具有最新 (datetime) 條目的記錄,包括該最新記錄中的 playerresource 資訊。

低效率方法(以及失敗的原因):

簡單的 GROUP BYMAX() 無法直接工作,因為 GROUP BY 聚合數據,丟失像 player 這樣的非聚合列。 嘗試使用子查詢來尋找每個家庭的最大日期時間,然後連接回原始表通常會導致不正確或不完整的結果。

有效的解決方案:

最有效的解決方案利用帶有子查詢的自連接:

<code class="language-sql">SELECT tt.*
FROM TopTen tt
INNER JOIN (
    SELECT home, MAX(datetime) AS MaxDateTime
    FROM TopTen
    GROUP BY home
) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime;</code>
登入後複製

此查詢的工作原理是:

  1. 子查詢 (groupedtt): 此內部查詢找出每個 datetime 的最大值 home,並依 home 將結果分組。
  2. 連接: 外部查詢將原始表(TopTen 別名為 tt)與子查詢的結果連接起來。 JOIN 條件確保只有與 home 和最大 datetime 都匹配的行才會包含在最終結果中。

此方法確保為每個 player 代表最大 resource 的行傳回原始表中的所有欄位(包括 datetimehome)。 這可以避免資料遺失並提供所需的完整資訊。

以上是如何使用MySQL中每個家庭的Max DateTime選擇行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板