解析mysql不重復(fù)字段值求和
更新時(shí)間:2013年06月23日 21:34:57 作者:
本篇文章是對(duì)關(guān)于mysql不重復(fù)字段值求和進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
在使用mysql時(shí),有時(shí)需要查詢出某個(gè)字段不重復(fù)的記錄,雖然mysql提供有distinct這個(gè)關(guān)鍵字來過濾掉多余的重復(fù)記錄只保留一條,但往往只用它來返回不重復(fù)記錄的條數(shù),而不是用它來返回不重記錄的所有值。其原因是distinct只能返回它的目標(biāo)字段,而無法返回其它字段,這個(gè)問題讓我困擾了很久,用distinct不能解決的話,我只有用二重循環(huán)查詢來解決,而這樣對(duì)于一個(gè)數(shù)據(jù)量非常大的站來說,無疑是會(huì)直接影響到效率的。所以我花了很多時(shí)間來研究這個(gè)問題,網(wǎng)上也查不到解決方案。。
下面先來看看例子:
table
id name
1 a
2 b
3 c
4 c
5 b
庫結(jié)構(gòu)大概這樣,這只是一個(gè)簡(jiǎn)單的例子,實(shí)際情況會(huì)復(fù)雜得多。
比如我想用一條語句查詢得到name不重復(fù)的所有數(shù)據(jù),那就必須使用distinct去掉多余的重復(fù)記錄。
select distinct name from table
得到的結(jié)果是:
name
a
c
好像達(dá)到效果了,可是,我想要得到的是id值呢?改一下查詢語句吧:
select distinct name, id from table
結(jié)果會(huì)是:
id name
1 a
2 b
3 c
4 c
5 b
distinct怎么沒起作用?作用是起了的,不過他同時(shí)作用了兩個(gè)字段,也就是必須得id與name都相同的才會(huì)被排除。。。。。。。
我們?cè)俑母牟樵冋Z句:
select id, distinct name from table
很遺憾,除了錯(cuò)誤信息你什么也得不到,distinct必須放在開頭。難到不能把distinct放到where條件里?能,照樣報(bào)錯(cuò)。。。。。。。
很麻煩吧?確實(shí),費(fèi)盡心思都沒能解決這個(gè)問題。沒辦法,繼續(xù)找人問。
拉住公司里一JAVA程序員,他給我演示了oracle里使用distinct之后,也沒找到mysql里的解決方案,最后下班之前他建議我試試group by。
試了半天,也不行,最后在mysql手冊(cè)里找到一個(gè)用法,用group_concat(distinct name)配合group by name實(shí)現(xiàn)了我所需要的功能,興奮,天佑我也,趕快試試。
報(bào)錯(cuò)。。。。。。。。。。。。郁悶。。。。。。。連mysql手冊(cè)也跟我過不去,先給了我希望,然后又把我推向失望,好狠哪。。。。
再仔細(xì)一查,group_concat函數(shù)是4.1支持,暈,我4.0的。沒辦法,升級(jí),升完級(jí)一試,成功。。。。。。
終于搞定了,不過這樣一來,又必須要求客戶也升級(jí)了。
突然靈機(jī)一閃,既然可以使用group_concat函數(shù),那其它函數(shù)能行嗎?
趕緊用count函數(shù)一試,成功,我。。。。。。。想哭啊,費(fèi)了這么多工夫。。。。。。。。原來就這么簡(jiǎn)單。。。。。。
現(xiàn)在將完整語句放出:
select *, count(distinct name) from table group by name
結(jié)果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
最后一項(xiàng)是多余的,不用管就行了,目的達(dá)到。。。。。
唉,原來mysql這么笨,輕輕一下就把他騙過去了,郁悶也就我吧,現(xiàn)在拿出來希望大家不要被這問題折騰。
哦,對(duì),再順便說一句,group by 必須放在 order by 和 limit之前,不然會(huì)報(bào)錯(cuò),差不多了,我繼續(xù)忙碌。。。。。。
下面先來看看例子:
table
id name
1 a
2 b
3 c
4 c
5 b
庫結(jié)構(gòu)大概這樣,這只是一個(gè)簡(jiǎn)單的例子,實(shí)際情況會(huì)復(fù)雜得多。
比如我想用一條語句查詢得到name不重復(fù)的所有數(shù)據(jù),那就必須使用distinct去掉多余的重復(fù)記錄。
select distinct name from table
得到的結(jié)果是:
name
a
c
好像達(dá)到效果了,可是,我想要得到的是id值呢?改一下查詢語句吧:
select distinct name, id from table
結(jié)果會(huì)是:
id name
1 a
2 b
3 c
4 c
5 b
distinct怎么沒起作用?作用是起了的,不過他同時(shí)作用了兩個(gè)字段,也就是必須得id與name都相同的才會(huì)被排除。。。。。。。
我們?cè)俑母牟樵冋Z句:
select id, distinct name from table
很遺憾,除了錯(cuò)誤信息你什么也得不到,distinct必須放在開頭。難到不能把distinct放到where條件里?能,照樣報(bào)錯(cuò)。。。。。。。
很麻煩吧?確實(shí),費(fèi)盡心思都沒能解決這個(gè)問題。沒辦法,繼續(xù)找人問。
拉住公司里一JAVA程序員,他給我演示了oracle里使用distinct之后,也沒找到mysql里的解決方案,最后下班之前他建議我試試group by。
試了半天,也不行,最后在mysql手冊(cè)里找到一個(gè)用法,用group_concat(distinct name)配合group by name實(shí)現(xiàn)了我所需要的功能,興奮,天佑我也,趕快試試。
報(bào)錯(cuò)。。。。。。。。。。。。郁悶。。。。。。。連mysql手冊(cè)也跟我過不去,先給了我希望,然后又把我推向失望,好狠哪。。。。
再仔細(xì)一查,group_concat函數(shù)是4.1支持,暈,我4.0的。沒辦法,升級(jí),升完級(jí)一試,成功。。。。。。
終于搞定了,不過這樣一來,又必須要求客戶也升級(jí)了。
突然靈機(jī)一閃,既然可以使用group_concat函數(shù),那其它函數(shù)能行嗎?
趕緊用count函數(shù)一試,成功,我。。。。。。。想哭啊,費(fèi)了這么多工夫。。。。。。。。原來就這么簡(jiǎn)單。。。。。。
現(xiàn)在將完整語句放出:
select *, count(distinct name) from table group by name
結(jié)果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
最后一項(xiàng)是多余的,不用管就行了,目的達(dá)到。。。。。
唉,原來mysql這么笨,輕輕一下就把他騙過去了,郁悶也就我吧,現(xiàn)在拿出來希望大家不要被這問題折騰。
哦,對(duì),再順便說一句,group by 必須放在 order by 和 limit之前,不然會(huì)報(bào)錯(cuò),差不多了,我繼續(xù)忙碌。。。。。。
相關(guān)文章
RHEL 6平臺(tái)MySQL數(shù)據(jù)庫服務(wù)器的安裝方法
這篇文章主要為大家詳細(xì)介紹了RHEL 6平臺(tái)MySQL數(shù)據(jù)庫服務(wù)器的安裝方法,感興趣的小伙伴們可以參考一下2016-05-05搞定mysql行轉(zhuǎn)列的7種方法以及列轉(zhuǎn)行
在MySQL數(shù)據(jù)庫中,有時(shí)候我們需要將一列數(shù)據(jù)轉(zhuǎn)化為行數(shù)據(jù),以便更好地進(jìn)行數(shù)據(jù)分析和處理,下面這篇文章主要給大家介紹了關(guān)于搞定mysql行轉(zhuǎn)列的7種方法以及列轉(zhuǎn)行的相關(guān)資料,需要的朋友可以參考下2024-03-03MySQL兩個(gè)查詢?nèi)绾魏喜⒊梢粋€(gè)結(jié)果詳解
利用union關(guān)鍵字,可以給出多條select語句,并將它們的結(jié)果組合成單個(gè)結(jié)果集,下面這篇文章主要給大家介紹了關(guān)于MySQL兩個(gè)查詢?nèi)绾魏喜⒊梢粋€(gè)結(jié)果的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南
這篇文章主要為大家介紹了SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11生產(chǎn)庫自動(dòng)化MySQL5.6安裝部署詳細(xì)教程
自動(dòng)化運(yùn)維是一個(gè)DBA應(yīng)該掌握的技術(shù),其中,自動(dòng)化安裝數(shù)據(jù)庫是一項(xiàng)基本的技能,這篇文章主要介紹了生產(chǎn)庫自動(dòng)化MySQL5.6安裝部署詳細(xì)教程,需要的朋友可以參考下2016-09-09windows系統(tǒng)mysql5.7.18安裝圖文教程
這篇文章主要為大家詳細(xì)介紹了windows系統(tǒng)下mysql5.7.18安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03