解析mysql不反復字段值乞降。本站提示廣大學習愛好者:(解析mysql不反復字段值乞降)文章只能為提供參考,不一定能成為您想要的結果。以下是解析mysql不反復字段值乞降正文
在應用mysql時,有時須要查詢出某個字段不反復的記載,固然mysql供給有distinct這個症結字來過濾失落過剩的反復記載只保存一條,但常常只用它來前往不反復記載的條數,而不是用它來前往不重記載的一切值。其緣由是distinct只能前往它的目的字段,而沒法前往其它字段,這個成績讓我困擾了良久,用distinct不克不及處理的話,我只要用二重輪回查詢來處理,而如許關於一個數據量異常年夜的站來講,無疑是會直接影響到效力的。所以我花了許多時光來研討這個成績,網上也查不到處理計劃。。
上面先來看看例子:
table
id name
1 a
2 b
3 c
4 c
5 b
庫構造年夜概如許,這只是一個簡略的例子,現實情形會龐雜很多。
好比我想用一條語句查詢獲得name不反復的一切數據,那就必需應用distinct去失落過剩的反復記載。
select distinct name from table
獲得的成果是:
name
a
c
似乎到達後果了,可是,我想要獲得的是id值呢?改一下查詢語句吧:
select distinct name, id from table
成果會是:
id name
1 a
2 b
3 c
4 c
5 b
distinct怎樣沒起感化?感化是起了的,不外他同時感化了兩個字段,也就是必需得id與name都雷同的才會被消除。。。。。。。
我們再改改查詢語句:
select id, distinct name from table
很遺憾,除毛病信息你甚麼也得不到,distinct必需放在開首。難到不克不及把distinct放到where前提裡?能,照樣報錯。。。。。。。
很費事吧?確切,費盡心思都沒能處理這個成績。沒方法,持續找人問。
拉住公司裡一JAVA法式員,他給我演示了oracle裡應用distinct以後,也沒找到mysql裡的處理計劃,最初上班之前他建議我嘗嘗group by。
試了半天,也不可,最初在mysql手冊裡找到一個用法,用group_concat(distinct name)合營group by name完成了我所須要的功效,高興,天助我也,趕緊嘗嘗。
報錯。。。。。。。。。。。。愁悶。。。。。。。連mysql手冊也跟我過不去,先給了我願望,然後又把我推向掉望,好狠哪。。。。
再細心一查,group_concat函數是4.1支撐,暈,我4.0的。沒方法,進級,升完級一試,勝利。。。。。。
終究弄定了,不外如許一來,又必需請求客戶也進級了。
忽然靈機一閃,既然可使用group_concat函數,那其它函數能行嗎?
趕忙用count函數一試,勝利,我。。。。。。。想哭啊,費了這麼多功夫。。。。。。。。本來就這麼簡略。。。。。。
如今將完全語句放出:
select *, count(distinct name) from table group by name
成果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
最初一項是過剩的,不消管就好了,目標到達。。。。。
唉,本來mysql這麼笨,悄悄一下就把他騙曩昔了,愁悶也就我吧,如今拿出來願望年夜家不要被這成績折騰。
哦,對,再趁便說一句,group by 必需放在 order by 和 limit之前,否則會報錯,差不多了,我持續勞碌。。。。。。