MySQL distinct 和 order by 排序混淆的替代方案

hxd_發表於2022-12-30

原文連結:何曉東 部落格

場景是:從一堆學習記錄中,去重並獲取最近學習的幾條課程ID,隨手就能想到這樣的一條SQL語句:

select distinct a from table order by updated_at desc limit 5

如果列為 a 的資料有很多條,就會發現最終取到的那條資料可能不是 updated_at 最近的那條資料,因為 distinct 有一次預設的排序,然後生成一個臨時表,
然後 order by 無法從最開始的原始資料中進行排序,僅排序中間表,無法得出正確結果。改成 distinct a, updated_at 的話,
實際上又失去了 distinct 的意義了。

方案一:
使用子查詢方式,將結果先排序,當做一個表,然後去重保留最新的一條資料

select distinct a from (select a from table order by updated_at desc) t limit 5

方案二:
藉助 max 和 group by 特性直接取最大值,取值

select a, max(updated_at) from table group by a order by updated_at desc limit 5

推薦使用方案二,可讀性高很多

相關文章