mysql group_concat合并行用法和问题

张映 发表于 2011-04-07

分类目录: mysql

标签:, ,

有的时候为了程序的简单,我们会用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 ...]]
             [SEPARATOR str_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

1 条评论

  1. asics shoes buy 留言

    我晕,眨眼一看天书~~~