有效返回MySQL 中每個群組的最後一行
返回MySQL 中每個群組的最後一行對於資料操作來說通常是必要的。提示中提供的查詢:
select * from foo as a where a.id = (select max(id) from foo where uid = a.uid group by uid) group by uid;
透過執行巢狀查詢來尋找每個唯一 UID 的最大 ID,然後僅選擇具有匹配 ID 的行來實現此目的。
更有效率的方法
但是,可以使用更有效率的查詢來消除巢狀查詢:
SELECT t1.* FROM foo t1 JOIN ( SELECT uid, MAX(id) AS max_id FROM foo GROUP BY uid ) t2 ON t1.id = t2.max_id;
此查詢使用JOIN 操作直接匹配每個UID 的最大ID,與嵌套查詢方法相比,提供更高的效能。
其他最佳化注意事項
為了進一步最佳化,可以使用 EXPLAIN 來分析查詢計畫並識別任何潛在的瓶頸。此外,UID 欄位上的索引可以顯著提高查詢效能。
替代方法
另一個選項是使用LAG() 函數:
SELECT t1.* FROM foo t1 LEFT JOIN foo t2 ON t1.id < t2.id AND t1.uid = t2.uid WHERE t2.id is NULL;
此查詢使用LAG() 函數來識別群組中的下一行。如果沒有後續行(即當前行是其群組中的最後一行),則查詢將傳回目前行。雖然這種方法可能很有效,但它可能並不總是像上面討論的基於 JOIN 的查詢那樣有效率。
以上是MySQL如何有效率地傳回每組的最後一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!