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

MySQL DISTINCT 查詢多欄位去重難題:GROUP BY 完美替代方案

     編輯:MySQL 資料庫相關知識

問題場景

表 table(id, name),需查詢 name 不重複的所有資料並保留 id。

SELECT DISTINCT name FROM table;  -- 僅回傳 name,無 id
SELECT DISTINCT name, id FROM table;  -- 對 (name,id) 組合去重,無效
SELECT id, DISTINCT name FROM table;  -- 語法錯誤

曲折嘗試歷程

  • GROUP_CONCAT(DISTINCT name) + GROUP BY name → 需 MySQL 4.1+
  • COUNT(DISTINCT name) + GROUP BY name → 可行但多產生計數欄
  • 最終發現最簡單解法: SELECT id, name FROM table GROUP BY name

核心原理

MySQL 允許 GROUP BY 欄位未出現在選取清單中的非彙總欄位 (非標準 SQL 行為),會自動選取該群組的第一筆記錄值。此特性恰好滿足「每個 name 取一筆 id」的需求。

完整範例

-- 測試資料
id | name
1  | a
2  | b
3  | c
4  | c
5  | b

-- 解法
SELECT id, name FROM table GROUP BY name;

-- 結果
id | name
1  | a
2  | b
3  | c

注意事項

  • GROUP BY 必須置於 ORDER BY 和 LIMIT 之前
  • 此行為依賴 MySQL 的 ONLY_FULL_GROUP_BY SQL 模式未啟用 (預設關閉),嚴格模式下需明確指定彙總函數
  • 若需確定性結果,建議搭配 ORDER BY id 確保取最小 id
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved