表 t(id, name):
| id | name |
|---|---|
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | c |
| 5 | b |
需求:按 name 去重,**同時返回 id**。
SELECT DISTINCT name, id FROM t;
-- 結果:5 行全返回,因 (name,id) 組合唯一
SELECT id, DISTINCT name FROM t; -- 語法錯誤,DISTINCT 必須在首位
SELECT *, COUNT(DISTINCT name) FROM t GROUP BY name;
結果:
| id | name | COUNT(DISTINCT name) |
|---|---|---|
| 1 | a | 1 |
| 2 | b | 1 |
| 3 | c | 1 |
SELECT * 配合 GROUP BY name,**非聚合列取每組第一行**(非標準行為,依賴 ONLY_FULL_GROUP_BY=OFF)。MIN(id) 或 MAX(id):SELECT MIN(id) AS id, name FROM t GROUP BY name;
SELECT name, GROUP_CONCAT(id ORDER BY id) AS ids
FROM t
GROUP BY name;
結果:a | 1、b | 2,5、c | 3,4。
GROUP_CONCAT 需 MySQL 4.1+。COUNT(DISTINCT ...) 技巧或應用層二次查詢。