MySQL中使用distinct單、多字段去重方法
多個字段拼接去重是指將多個字段的值按照一定的規(guī)則進(jìn)行拼接,并去除重復(fù)的拼接結(jié)果。這樣可以生成唯一標(biāo)識符或者進(jìn)行數(shù)據(jù)統(tǒng)計。
一、distinct
distinct用來查詢不重復(fù)記錄的條數(shù),即distinct來返回不重復(fù)字段的條數(shù)(count(distinct id)),其原因是distinct只能返回他的目標(biāo)字段,而無法返回其他字段
用法注意:
distinct【查詢字段】,必須放在要查詢字段的開頭,即放在第一個參數(shù);
只能在SELECT 語句中使用,不能在 INSERT, DELETE, UPDATE 中使用;
DISTINCT 表示對后面的所有參數(shù)的拼接取不重復(fù)的記錄,即查出的參數(shù)拼接每行記錄都是唯一的
不能與all同時使用,默認(rèn)情況下,查詢時返回的就是所有的結(jié)果。
1.1 只對一個字段查重
對一個字段查重,表示選取該字段一列不重復(fù)的數(shù)據(jù)。
示例表:psur_list
PLAN_NUMBER字段去重,語句:
SELECT DISTINCT PLAN_NUMBER FROM psur_list;
1.2多個字段去重
對多個字段去重,表示選取多個字段拼接的一條記錄,不重復(fù)的所有記錄
PLAN_NUMBER和PRODUCT_NAME字段去重,語句:
SELECT DISTINCT PLAN_NUMBER,PRODUCT_NAME FROM psur_list;
期望結(jié)果:只對第一個參數(shù)PLAN_NUMBER取唯一值
解決辦法一:使用group_concat 函數(shù)
語句:
SELECT GROUP_CONCAT(DISTINCT PLAN_NUMBER) AS PLAN_NUMBER,PRODUCT_NAME from psur_list GROUP BY PLAN_NUMBER
解決辦法二:使用group by語句:
SELECT PLAN_NUMBER,PRODUCT_NAME FROM psur_list GROUP BY PLAN_NUMBER
1.3針對null處理
distinct不會過濾掉null值,返回結(jié)果包含null值
表psur_list如下:
對COUNTRY單字段去重,語句:
SELECT DISTINCT COUNTRY FROM psur_list
對COUNTRY多字段去重,語句:
SELECT DISTINCT PRODUCT_NAME,COUNTRY FROM psur_list
1.4與distinctrow同義
語句:
SELECT DISTINCTROW COUNTRY FROM psur_list
二、聚合函數(shù)中使用distinct
在聚合函數(shù)中DISTINCT 一般跟 COUNT 結(jié)合使用。count()會過濾掉null項(xiàng)
SELECT DISTINCT COUNTRY FROM psur_list
語句:
SELECT COUNT(DISTINCT COUNTRY) FROM psur_list
結(jié)果如下:【實(shí)際包含null項(xiàng)有4個記錄,執(zhí)行語句后過濾null項(xiàng),計算為3】
例二:多字段
SELECT DISTINCT PRODUCT_NAME,COUNTRY FROM psur_list //9條
語法:
SELECT COUNT(DISTINCT PRODUCT_NAME,COUNTRY) FROM psur_list
兩者都把null行過濾了,注意使用。
三、CONCAT_WS函數(shù)
創(chuàng)建測試表
首先,我們需要創(chuàng)建一個測試表來演示多個字段拼接去重的過程。假設(shè)我們有一個users表,包含以下字段:
id name age gender 1 Alice 25 Female 2 Bob 30 Male 3 Alice 25 Female 4 Alice 30 Female
我們將使用這個表來進(jìn)行演示。
使用GROUP_CONCAT函數(shù)進(jìn)行拼接
MySQL提供了GROUP_CONCAT函數(shù),可以用來將一列的值進(jìn)行拼接。我們可以使用這個函數(shù)來實(shí)現(xiàn)多個字段的拼接。
下面的示例將演示如何將name和age字段進(jìn)行拼接,并去重:
SELECT GROUP_CONCAT(DISTINCT CONCAT(name, age) SEPARATOR ',') FROM users;
運(yùn)行以上SQL語句,將會返回去重后的拼接結(jié)果:
Alice25,Alice30,Bob30
使用CONCAT_WS函數(shù)進(jìn)行拼接除了GROUP_CONCAT函數(shù),MySQL還提供了CONCAT_WS函數(shù),它可以將多個字段的值進(jìn)行拼接,并使用指定的分隔符進(jìn)行分隔。
下面的示例將演示如何將name和age字段進(jìn)行拼接,并使用逗號作為分隔符:
SELECT CONCAT_WS(',', name, age) FROM users GROUP BY name, age;
運(yùn)行以上SQL語句,將會返回拼接后的結(jié)果:
Alice,25
Alice,30
Bob,30
去除重復(fù)的拼接結(jié)果在上述示例中,我們可以看到,使用GROUP_CONCAT或者CONCAT_WS函數(shù)可以將多個字段進(jìn)行拼接,但是它們并不能去除重復(fù)的拼接結(jié)果。如果我們需要去除重復(fù)的拼接結(jié)果,可以使用子查詢和DISTINCT關(guān)鍵字來實(shí)現(xiàn)。
下面的示例演示了如何使用子查詢和DISTINCT關(guān)鍵字來去除重復(fù)的拼接結(jié)果:???????
SELECT DISTINCT CONCAT_WS(',', name, age) FROM ( SELECT name, age FROM users GROUP BY name, age ) AS subquery;
運(yùn)行以上SQL語句,將會返回去重后的拼接結(jié)果:???????
Alice,25
Alice,30
Bob,30
參考文章:
【sql】MySQL中使用distinct單、多字段去重方法_mysql distinct 多個字段-CSDN博客
mysql GROUP_CONCAT函數(shù)詳解-CSDN博客
mysql 多個字段拼接去重(GROUP_CONCAT)_mysql group_concat 去重-CSDN博客
到此這篇關(guān)于MySQL中使用distinct單、多字段去重方法的文章就介紹到這了,更多相關(guān)MySQL 字段去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL利用索引優(yōu)化ORDER BY排序語句的方法
這篇文章主要介紹了MySQL利用索引優(yōu)化ORDER BY排序語句的方法,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2020-10-10percona-toolkit之pt-kill 殺掉mysql查詢或連接的方法
本文主要描述了percona-toolkit中pt-kill的 使用實(shí)例 ,及 一些重要參數(shù)的介紹,需要的朋友可以參考下2016-04-04mysql數(shù)據(jù)庫優(yōu)化必會的幾個參數(shù)中文解釋
對于自己配置mysql數(shù)據(jù)庫的朋友,需要注意的幾點(diǎn),下面都是英文的解釋,比較易懂方便和我一樣需要優(yōu)化配置mysql的朋友2008-09-09mysql5.7及mysql 8.0版本修改root密碼的方法小結(jié)
這篇文章主要介紹了mysql5.7及mysql 8.0版本修改root密碼方式 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11Win 8或以上系統(tǒng)下MySQL最新版5.7.17(64bit ZIP綠色版)安裝部署教程
這篇文章主要為大家詳細(xì)介紹了Win 8或以上系統(tǒng)下MySQL最新版5.7.17 64bit ZIP綠色版安裝部署教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05mysql數(shù)據(jù)庫存儲過程之游標(biāo)(光標(biāo)cursor)詳解
這篇文章主要介紹了mysql數(shù)據(jù)庫存儲過程之游標(biāo)(光標(biāo)cursor)詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07