首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL DISTINCT 多欄位去重實戰:從 GROUP BY 到 COUNT(DISTINCT) 的演進

     編輯:MySQL 資料庫相關知識

問題情境

資料表 t(id, name):

id | name
1  | a
2  | b
3  | c
4  | c
5  | b

需求:取得 name 不重複的所有資料,並保留對應的 id(取第一筆)。

錯誤嘗試

SELECT DISTINCT name, id FROM t;  -- 同時對兩欄去重,無效
SELECT id, DISTINCT name FROM t;  -- 語法錯誤,DISTINCT 必須置於 SELECT 後

可行方案演進

方案一:GROUP BY + 聚合函數(MySQL 4.0+ 通用)

SELECT *, COUNT(DISTINCT name) FROM t GROUP BY name;

結果:

id | name | COUNT(DISTINCT name)
1  | a    | 1
2  | b    | 1
3  | c    | 1

最後一欄為統計值可忽略。注意:GROUP BY 必須置於 ORDER BY、LIMIT 之前。

方案二:GROUP_CONCAT(需 MySQL 4.1+)

SELECT GROUP_CONCAT(DISTINCT name) FROM t GROUP BY name;

若環境允許升級至 4.1 以上,此法更直觀。

方案三:最簡寫法(MySQL 允許非標準 GROUP BY)

SELECT id, name FROM t GROUP BY name;

MySQL 會自動取每組第一筆 id,符合大多數「保留第一筆」需求,且效能最佳。

最佳實踐建議

  • 優先使用 SELECT id, name FROM t GROUP BY name(簡潔、高效)。
  • 若需嚴格 ANSI SQL 相容,改用子查詢或窗口函數(MySQL 8.0+ ROW_NUMBER())。
  • 避免在大表上使用 DISTINCT 多欄位,改用 GROUP BY 並配合索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved