mysql中GROUP BY結合GROUP_CONCAT的使用 我們知道,group by可以將sql查詢結果按照group by後面列進行分類顯示。比如: Sql代碼 www.2cto.com select columnA,columnB from table group by columnA,columnB 則查詢結果將按照columnA和columnB分類顯示。沒有顯示在group by中的列不能直接作為返回列放在sql語句中,比如如下sql就是不正確的 Sql代碼 select columnA,columnC from table group by columnA 由於columnC不在group by的范圍之類,所以這樣寫是不對的,所幸的是,group by支持一些sql 函數的使用,比如SUM,AVG,COUNT等等。這些都比較常用,今天我要記錄下的是這個不常用的GROUP_CONCAT。 www.2cto.com 有一個需求,需要用到group by 才能實現,可是,我同是還需要返回某列的所有結果,(注意,不是做avg,sum等操作,我要枚舉這列的所有結果),那麼就可以用到GROUP_CONCAT。 舉個例子: 我有一張數據庫表結構如下: 列名 含義 year 年份 month 月份 volumn 期數 該表存儲了某雜志的年份,月份和期數。如果需求對該表內容作如下顯示: 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代碼 select year,month from magazine group by year,month order by year desc,month desc 那具體的期數信息就丟了?能不能做group by的時候,還能返回在某個年份year和月份month分組下的所有期數volumn信息?(某個年份+月份下的期數信息是不固定的,只能通過數據庫查詢才能獲得) 該是GROUP_CONCAT上陣的時候了。 Sql代碼 select year,month GROUP_CONCAT(volumn) from magazine group by year,month order by year desc, month 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代碼 select year,month GROUP_CONCAT(conv( oct( volumn ) , 8, 10 )) from magazine group by year,month order by year desc, month desc 上面的sql對volumn做了一個從8進制到10進制的轉換,這樣返回的就是一個字符串了。 mysql默認會以‘,’來分隔多的值,如果想用其他的分隔符來分隔返回結果,比如期望返回值是這樣的:1|2|3|4 這可以用SEPARATOR來搞定。 Sql代碼 select year,month GROUP_CONCAT(conv( oct( volumn ) , 8, 10 ) SEPARATOR '|') from magazine group by year,month order by year desc, month desc 更牛的是,你甚至可以對返回的volumn進行排序!! Sql代碼 select year,month GROUP_CONCAT(conv( oct( volumn ) , 8, 10 ) order by volumn desc SEPARATOR '|') from magazine group by year,month order by year desc, month desc 這個不常用的東東,還是比較好用的。