mysql中GROUP BY結合GROUP_CONCAT的使用

咱們知道,group by能夠將sql查詢結果按照group by後面列進行分類顯示。好比:
Sql代碼    收藏代碼
  1. select columnA,columnB from table group by columnA,columnB  

 則查詢結果將按照columnA和columnB分類顯示。沒有顯示在group by中的列不能直接做爲返回列放在sql語句中,好比以下sql就是不正確的 javascript

Sql代碼    收藏代碼
  1. select columnA,columnC from table group by columnA   

 因爲columnC不在group by的範圍之類,因此這樣寫是不對的,所幸的是,group by支持一些sql 函數的使用,好比SUM,AVG,COUNT等等。這些都比較經常使用,今天我要記錄下的是這個不經常使用的GROUP_CONCAT。 java

 

有一個需求,須要用到group by 才能實現,但是,我同是還須要返回某列的全部結果,(注意,不是作avg,sum等操做,我要枚舉這列的全部結果),那麼就能夠用到GROUP_CONCAT。 mysql

舉個例子: sql

我有一張數據庫表結構以下: 數據庫

列名 含義
year 年份
month 月份
volumn 期數

該表存儲了某雜誌的年份,月份和期數。若是需求對該表內容做以下顯示: app

 

2010年12月 第1期  第2期  第3期 第4期
2010年11月 第1期  第2期  第3期 第4期  第5期
2010年10月 第1期  第2期  第3期 第4期
2010年9月 第1期  第2期  第3期 第4期  第5期
2010年8月 第1期  第2期  第3期 第4期 

 

sql該怎麼寫呢?按照年份和月份作group by?而後按照年份和月份作倒敘排列? 函數

Sql代碼    收藏代碼
  1. select year,month from magazine group by year,month order by year desc,month desc  

 那具體的期數信息就丟了?能不能作group by的時候,還能返回在某個年份year和月份month分組下的全部期數volumn信息?(某個年份+月份下的期數信息是不固定的,只能經過數據庫查詢才能得到) spa

該是GROUP_CONCAT上陣的時候了。 .net

Sql代碼    收藏代碼
  1. select year,month GROUP_CONCAT(volumn) from magazine group by year,month order by year descmonth desc  

 這樣,查詢的返回結果相似於: 排序

year month GROUP_CONCAT(volumn)
2010 12 1,2,3,4
2010 11 1,2,3,4,5

 

不錯吧?

還有點問題須要補充下,就是做爲GROUP_CONCAT函數參數的字段,如過返回值爲string,則上面的sql語句已經沒有問題,可是若是是number,則返回的GROUP_CONCAT(volumn)值爲BLOB類型(其實上面例子返回的就是一個blob類型,我只是爲了演示的方便),須要作一下轉化。

Sql代碼    收藏代碼
  1. select year,month GROUP_CONCAT(conv( oct( volumn ) , 8, 10 )) from magazine group by year,month order by year descmonth desc  

 上面的sql對volumn作了一個從8進制到10進制的轉換,這樣返回的就是一個字符串了。

mysql默認會以‘,’來分隔多的值,若是想用其餘的分隔符來分隔返回結果,好比指望返回值是這樣的:1|2|3|4

這能夠用SEPARATOR來搞定。

Sql代碼    收藏代碼
  1. select year,month GROUP_CONCAT(conv( oct( volumn ) , 8, 10 ) SEPARATOR '|'from magazine group by year,month order by year descmonth desc   

更牛的是,你甚至能夠對返回的volumn進行排序!!

Sql代碼    收藏代碼
  1. select year,month GROUP_CONCAT(conv( oct( volumn ) , 8, 10 ) order by volumn desc SEPARATOR '|'from magazine group by year,month order by year descmonth desc  

 

這個不經常使用的東東,仍是比較好用的。

相關文章
相關標籤/搜索