首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL DISTINCT 陷阱:多欄去重失效原因與 GROUP BY 正解

     編輯:MySQL 綜合教學

現象:DISTINCT 不能跨欄去重

SELECT DISTINCT mac, ip FROM ip;
-- 只要 (mac, ip) 組合不完全相同,就不會去重

期望:mac 相同只保留第一行 ip,但 DISTINCT 作用於「所有選取欄位的組合」。

正解:GROUP BY 目標欄位 + 聚合函數

-- 取每個 mac 的第一筆 ip (任意)
SELECT mac, MIN(ip) AS ip FROM ip GROUP BY mac;

-- 或任意一行 (MySQL 允許非聚合欄位)
SELECT mac, ip FROM ip GROUP BY mac;
-- ⚠ 非 ONLY_FULL_GROUP_BY 模式下隨機取值,生產環境請明確聚合

進階:找出 mac 相同但 ip 不同的記錄

SELECT DISTINCT a.mac, a.ip
FROM ip a JOIN ip b ON a.mac = b.mac AND a.ip != b.ip
ORDER BY a.mac;

自關聯找出同 mac 不同 ip 的組合。

COUNT(DISTINCT ...) 統計不重複值

SELECT mac, COUNT(DISTINCT ip) AS ip_cnt FROM ip GROUP BY mac;

核心原則

  • DISTINCT = 對整行去重。
  • GROUP BY col = 按 col 分組,配合聚合函數取代表值。
  • 嚴格模式 (ONLY_FULL_GROUP_BY) 下,SELECT 列必須在 GROUP BY 或聚合函數中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved