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
) 條目的記錄,包括該最新記錄中的 player
和 resource
資訊。
低效率方法(以及失敗的原因):
簡單的 GROUP BY
和 MAX()
無法直接工作,因為 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>
此查詢的工作原理是:
groupedtt
): 此內部查詢找出每個 datetime
的最大值 home
,並依 home
將結果分組。 TopTen
別名為 tt
)與子查詢的結果連接起來。 JOIN
條件確保只有與 home
和最大 datetime
都匹配的行才會包含在最終結果中。 此方法確保為每個 player
代表最大 resource
的行傳回原始表中的所有欄位(包括 datetime
和 home
)。 這可以避免資料遺失並提供所需的完整資訊。
以上是如何使用MySQL中每個家庭的Max DateTime選擇行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!