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

MySQL SELECT DISTINCT 進階用法:獲取非重複行的完整列數據

     編輯:MySQL 綜合教學

MySQL SELECT DISTINCT 進階用法:獲取非重複行的完整列數據

DISTINCT 僅能返回目標列,無法直接獲取其他列。本文通過實例演示為何 DISTINCT col1, col2 不符合預期,並提供 GROUP BY、GROUP_CONCAT、聚合函數等多種實戰解法。

問題場景

表 test:

idtest1test2
1a1
2a2
3a3
4a1
5b1
6b2
7b3
8b2

需求:按 test1 去重,同時返回對應的 id、test2(取每組第一行)。

失敗嘗試分析

-- 僅返回目標列
SELECT DISTINCT test1 FROM test;  -- 結果: a, b ✓

-- 加入 id 導致去重失效(因 id 唯一)
SELECT DISTINCT test1, id FROM test;  -- 返回 8 行 ✗

-- 語法錯誤:DISTINCT 必須置於選項列表首位
SELECT id, DISTINCT test1 FROM test;  -- ERROR ✗

可行方案對比

方案一:GROUP BY(推薦,簡單高效)

SELECT id, test1, test2 FROM test GROUP BY test1;
-- 結果:id=1(test1=a), id=5(test1=b) ✓
-- MySQL 允許 SELECT 非聚合非 GROUP BY 列,取每組第一行(ONLY_FULL_GROUP_BY 關閉時)

方案二:GROUP_CONCAT(MySQL 4.1+)

SELECT id, GROUP_CONCAT(DISTINCT test1) FROM test GROUP BY test1;
-- 結果:id=1 | a,  id=5 | b ✓
-- 缺點:將去重值拼接為字符串,非原始列

方案三:聚合函數佔位

SELECT *, COUNT(DISTINCT test1) FROM test GROUP BY test1;
-- 最後一列為常量 1,可忽略 ✓

方案四:子查詢關聯(標準 SQL 寫法)

SELECT t.* FROM test t
INNER JOIN (
  SELECT MIN(id) AS min_id FROM test GROUP BY test1
) tm ON t.id = tm.min_id;
-- 明確語義,兼容 ONLY_FULL_GROUP_BY=ON ✓

版本兼容性提示

  • MySQL 5.7+ 默認開啟 ONLY_FULL_GROUP_BY,方案一、三會報錯
  • 生產環境建議使用方案四或開啟 ANY_VALUE() 函數:SELECT ANY_VALUE(id), test1 FROM test GROUP BY test1

最佳實踐建議

  1. 優先使用 GROUP BY + ANY_VALUE()(MySQL 5.7+)
  2. 需標準 SQL 兼容時用子查詢關聯
  3. 避免 GROUP_CONCAT 除非確需字符串聚合
  4. 務必在去重列上建立索引提升性能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved