有的时候为了程序的简单,我们会用mysql的group_concat来合并列,用着很方便,但是也会出现问题
一,准备测试表
mysql> show create table test\G; //测试表 *************************** 1. row *************************** Table: test Create Table: CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `nickname` varchar(255) NOT NULL DEFAULT '', `sex` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) ERROR: No query specified mysql> select * from test; //测试数据 +----+-----------+----------+-----+ | id | name | nickname | sex | +----+-----------+----------+-----+ | 1 | 张映 | tank | 1 | | 2 | zhang | tank | 1 | | 3 | ying | | 1 | | 4 | zhangying | tank | 1 | +----+-----------+----------+-----+ 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
...]] [SEPARATORstr_val
])
mysql> SELECT GROUP_CONCAT(name) AS name,GROUP_CONCAT(nickname separator "|") as nickname from test GROUP BY sex; +-----------------------------+-----------------+ | name | nickname | +-----------------------------+-----------------+ | 张映,zhang,ying,zhangying | tank|tank||tank | +-----------------------------+-----------------+ 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字节,
mysql> show variables like "%concat%"; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | group_concat_max_len | 1024 | +----------------------+-------+ 1 row in set (0.00 sec)
如果超过了这个长度,我想数据取不全,有兴趣的朋友可以试一下。如果想改大的话,在my.cnf中的[mysqld]加上以下内容group_concat_max_len = 10240,重起一下mysql就行了。
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/mysql/1237.html
我晕,眨眼一看天书~~~