資料表 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 後
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 之前。
SELECT GROUP_CONCAT(DISTINCT name) FROM t GROUP BY name;
若環境允許升級至 4.1 以上,此法更直觀。
SELECT id, name FROM t GROUP BY name;
MySQL 會自動取每組第一筆 id,符合大多數「保留第一筆」需求,且效能最佳。
SELECT id, name FROM t GROUP BY name(簡潔、高效)。ROW_NUMBER())。DISTINCT 多欄位,改用 GROUP BY 並配合索引。