MySQL:控制在Group BY 查詢中傳回哪一行
在MySQL 中,從每個群組中擷取具有最高值的行是一項共同的任務。但是,將標準 GROUP BY 子句與 ORDER BY 一起使用有時會導致意外結果。
為了實現此目的,我們可以採用替代方法來覆寫預設分組行為:
子查詢方法:
該方法涉及建立一個子查詢來取得每個唯一的最大version_id id:
SELECT * FROM (SELECT id, MAX(version_id) AS version_id FROM table GROUP BY id) t1 INNER JOIN table t2 ON (t2.id = t1.id AND t1.version_id = t2.version_id)
此查詢將原始表與子查詢連接起來,該子查詢為每個 id 選擇最大 version_id。連線確保僅傳回具有最高 version_id 的行。
使用ORDER BY 技巧的子查詢:
子查詢方法的一種變體涉及在子查詢以確保特定的排序:
SELECT * FROM (SELECT * FROM table ORDER BY version_id DESC) t1 GROUP BY t1.id
此查詢有效地按降序對行進行排序在執行分組之前,確保每個組中保留version_id 最高的行。
命名Windows 函數:
視窗函數允許計算在視窗定義的一組行中執行,可用於此任務:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY version_id DESC) AS rn FROM table ) t WHERE rn = 1
此查詢計算行ROW_NUMBER 定義的分割區內每個唯一ID 的編號。 WHERE 子句過濾掉行號不為 1 的行,確保只傳回每個 id 具有最高 version_id 的行。
以上是MySQL中如何選擇每組中值最高的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!