• 云途科技成立于2010年 - 专注全球跨境电商服务器租赁托管!
  • 帮助中心

    您可以通过下方搜索框快速查找您想知道的问题

    mysql group_concat合并行用法和问题

      in  数据库      Tags: 

    有的时候为了程序的简单,我们会用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就行了。



    • 外贸虚拟主机

      1GB硬盘

      2个独立站点

      1000M带宽

      不限制流量

      美国外贸专用虚拟主机,cPanel面板,每天远程备份.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥180/年

    • 美国/荷兰外贸VPS

      2核CPU

      1G内存

      30硬盘

      10M带宽

      美国/荷兰外贸云服务器,专注外贸服务器行业12年.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥99/月

    • 全球外贸服务器

      8核CPU

      32G内存

      1TB硬盘

      1000M带宽

      已部署数据中心:美国洛杉矶/亚特兰大、荷兰、加拿大、英国伦敦、德国、拉脱维亚、瑞典、爱沙尼亚
      自有机柜(全球九大数据中心),稳定在线率:99.9%

      ¥999/月 原价1380

    7*24小时 在线提交工单

    如果您的问题没有得到解决,推荐您在线提交工单,我们的客服人员会第一时间为您解决问题

    展开