> 数据库 > MySQL >

mysql group_concat合并行用法和问题

有的时候为了程序的简单,我们会用mysql的group_concat来合并列,用着很方便,但是也会出现问题

 

一,准备测试表

查看复制打印?
  1. mysql> show create table test\G;     //测试表  
  2. *************************** 1. row ***************************  
  3.  Table: test  
  4. Create Table: CREATE TABLE `test` (  
  5.  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  
  6.  `name` varchar(255) NOT NULL DEFAULT '',  
  7.  `nickname` varchar(255) NOT NULL DEFAULT '',  
  8.  `sex` varchar(255) NOT NULL,  
  9.  PRIMARY KEY (`id`)  
  10. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8  
  11. 1 row in set (0.00 sec)  
  12.   
  13. ERROR:  
  14. No query specified  
  15.   
  16. mysql> select * from test;           //测试数据  
  17. +----+-----------+----------+-----+  
  18. | id | name      | nickname | sex |  
  19. +----+-----------+----------+-----+  
  20. |  1 | 张映      | tank     | 1   |  
  21. |  2 | zhang     | tank     | 1   |  
  22. |  3 | ying      |          | 1   |  
  23. |  4 | zhangying | tank     | 1   |  
  24. +----+-----------+----------+-----+  
  25. 4 rows in set (0.00 sec)  

二,group_concat的用法

规则如下

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])
查看复制打印?
  1. mysql> SELECT GROUP_CONCAT(name) AS name,GROUP_CONCAT(nickname separator "|"as nickname from test GROUP BY sex;  
  2. +-----------------------------+-----------------+  
  3. | name                        | nickname        |  
  4. +-----------------------------+-----------------+  
  5. | 张映,zhang,ying,zhangying   | tank|tank||tank |  
  6. +-----------------------------+-----------------+  
  7. 1 row in set (0.00 sec)  

这样我就能把我要的行中的某些列给拿出来了,就不用去写循环组合数据了。

二,group_concat的存在的问题

1,如果想合并的列是int型的,合并出来提示[BLOB - 7 B]或者[BLOB - 7 字节],这个时候要GROUP_CONCAT( cast( id AS char ) ) AS id 而不能GROUP_CONCAT( id  ) AS id,cast是一个转换函数

2,group_concat对长度是有限制的,mysql默认的是1024字节,

查看复制打印?
  1. mysql> show variables like "%concat%";  
  2. +----------------------+-------+  
  3. | Variable_name        | Value |  
  4. +----------------------+-------+  
  5. | group_concat_max_len | 1024  |  
  6. +----------------------+-------+  
  7. 1 row in set (0.00 sec)  

如果超过了这个长度,我想数据取不全,有兴趣的朋友可以试一下。如果想改大的话,在my.cnf中的[mysqld]加上以下内容group_concat_max_len = 10240,重起一下mysql就行了。

(责任编辑:IT)