MySQL的GROUP_CONCAT函數

來源:互聯網
上載者:User

標籤:mysql   group_concat   

   隨著業務的不斷增長,最近一段需要對大量的曆史資料整理,而在整理過程中有一張表的資料需要把其中一張表中一個不唯一的欄位的列作為唯一欄位在新表中而其中相關聯的欄位全部存入同一條記錄中,剛剛開始想了一會,到後來在得知GROUP_CONCAT函數就可以解決,作用是在使用彙總函式時使用該函數返回一個字串結果,並帶有非NULL值一組中的值, 如果沒有非NULL值,則返回NULL,自己用了下確實是不錯,在這裡就簡單的記錄說明一下,而GROUP_CONCAT函數使用也很簡單

GROUP_CONCAT([DISTINCT] expr [,expr ...]             [ORDER BY {unsigned_integer | col_name | expr}                 [ASC | DESC] [,col_name ...]]             [SEPARATOR str_val])

舉一個例子,如下:

DROP TABLE IF EXISTS `employee_tbl`;CREATE TABLE `employee_tbl` (  `id` int(11) NOT NULL,  `name` char(10) NOT NULL DEFAULT ‘‘,  `date` datetime NOT NULL,  `singin` tinyint(4) NOT NULL DEFAULT ‘0‘ COMMENT ‘登入次數‘,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `employee_tbl` VALUES (‘1‘, ‘小明‘, ‘2016-04-22 15:25:33‘, ‘1‘);INSERT INTO `employee_tbl` VALUES (‘2‘, ‘小王‘, ‘2016-04-20 15:25:47‘, ‘3‘);INSERT INTO `employee_tbl` VALUES (‘3‘, ‘小麗‘, ‘2016-04-19 15:26:02‘, ‘2‘);INSERT INTO `employee_tbl` VALUES (‘4‘, ‘小王‘, ‘2016-04-07 15:26:14‘, ‘4‘);INSERT INTO `employee_tbl` VALUES (‘5‘, ‘小明‘, ‘2016-04-11 15:26:40‘, ‘4‘);INSERT INTO `employee_tbl` VALUES (‘6‘, ‘小明‘, ‘2016-04-04 15:26:54‘, ‘2‘);

在這張表中需要在新表中記錄name、date這2個欄位的內容,其中需要name欄位唯一,date多條記錄用逗號隔開存入同一欄位,在使用GROUP_CONCAT函數就可以很簡單的查詢出所需要的資料

mysql> SELECT `name`, GROUP_CONCAT(date) ‘date‘ FROM employee_tbl GROUP BY `name`;+--------+-------------------------------------------------------------+| name   | date                                                        |+--------+-------------------------------------------------------------+| 小麗   | 2016-04-19 15:26:02                                         || 小明   | 2016-04-22 15:25:33,2016-04-11 15:26:40,2016-04-04 15:26:54 || 小王   | 2016-04-20 15:25:47,2016-04-07 15:26:14                     |+--------+-------------------------------------------------------------+3 rows in set (0.01 sec)

如此就把資料投影出來了,其中預設的分隔字元是逗號,如果需要可以指定其他分隔字元,如‘;‘

mysql> SELECT `name`, GROUP_CONCAT(date SEPARATOR ‘;‘) ‘date‘ FROM employee_tbl GROUP BY `name`;+--------+-------------------------------------------------------------+| name   | date                                                        |+--------+-------------------------------------------------------------+| 小麗   | 2016-04-19 15:26:02                                         || 小明   | 2016-04-22 15:25:33;2016-04-11 15:26:40;2016-04-04 15:26:54 || 小王   | 2016-04-20 15:25:47;2016-04-07 15:26:14                     |+--------+-------------------------------------------------------------+3 rows in set (0.01 sec)

總之在使用GROUP_CONCAT函數可以解決很多複製的問題,而在使用的過程中有幾個需要注意的地方:

1、在查出來的結果在其中必須使用GROUP BY做其中一個關聯欄位做去重使得其中一個欄位變成該列的唯一值做彙總

2、在使用GROUP_CONCAT函數時在MySQL中對其處理的結果最大長度(字元)限制,用了GROUP_CONCAT函數,SELECT語句中的LIMIT語句起不了任何作用,預設的字串長度限制是1024(個字元),如果處理的欄位超過1024個字元時需要修改系統變數

mysql> SHOW GLOBAL VARIABLES LIKE ‘group_concat_max_len‘;+----------------------+-------+| Variable_name        | Value |+----------------------+-------+| group_concat_max_len | 1024  |+----------------------+-------+1 row in set (0.01 sec)

3、串連的欄位為INT類型時,低版本或出現返回的結果不是逗號分隔的字串,而是byte[]。此時,需要用CAST或CONVERT函數進行轉換。

本文出自 “Jim的技術隨筆” 部落格,謝絕轉載!

MySQL的GROUP_CONCAT函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.