則查詢結果將按照columnA和columnB分類顯示。沒有顯示在group by中的列不能直接做爲返回列放在sql語句中,好比以下sql就是不正確的 javascript
因爲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?而後按照年份和月份作倒敘排列? 函數
那具體的期數信息就丟了?能不能作group by的時候,還能返回在某個年份year和月份month分組下的全部期數volumn信息?(某個年份+月份下的期數信息是不固定的,只能經過數據庫查詢才能得到) spa
該是GROUP_CONCAT上陣的時候了。 .net
這樣,查詢的返回結果相似於: 排序
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對volumn作了一個從8進制到10進制的轉換,這樣返回的就是一個字符串了。
mysql默認會以‘,’來分隔多的值,若是想用其餘的分隔符來分隔返回結果,好比指望返回值是這樣的:1|2|3|4
這能夠用SEPARATOR來搞定。
更牛的是,你甚至能夠對返回的volumn進行排序!!
這個不經常使用的東東,仍是比較好用的。