mysql中GROUP_CONCAT函数使用技巧及问题详解

 更新时间:2023年11月02日 08:53:08   作者:肖码哥  
这篇文章主要给大家介绍了关于mysql中GROUP_CONCAT函数使用技巧及问题的相关资料,GROUP_CONCAT是MySQL中的一个聚合函数,它用于将多行数据按照指定的顺序连接成一个字符串并返回结果,需要的朋友可以参考下

概要

` group_concat函数是mysql中非常实用的函数,它可以将同一个分组下的行拼接在一起。其完整语法:

GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

使用技巧

1. 建表、插入数据

#建表语句
CREATE TABLE `test_group_concat` (
  `id` int(11) NOT NULL COMMENT 'id',
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
#插入测试数据
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (1, 20);
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (1, 20);
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (1, 10);
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (3, 30);
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (3, 40);
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (3, 40);
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (4, 50);
INSERT INTO `test`.`test_group_concat` (`id`, `age`) VALUES (4, 60);

#基本查询
SELECT * FROM test_group_concat

2.以id分组,把age字段的值拼成一行,逗号分隔(默认)

select id,group_concat(age) from test_group_concat group by id;

3.以id分组,把age字段的值拼成 一行,分号分隔

select id,group_concat(age separator ';') from test_group_concat group by id;

4.以id分组,把去冗余的age字段的值打印在一行

select id,group_concat(distinct age) from test_group_concat group by id;

5.以id分组,把age字段的值打印在一行,逗号分隔,以age排倒序

select id,group_concat(age order by age desc) from test_group_concat group by id; 

发现问题

在项目用到如下sql

SELECT
	GROUP_CONCAT( c.goods_detail_id ) 
FROM
	air_out_order a
	LEFT JOIN air_out_order_detail b ON b.order_id = a.id
	LEFT JOIN air_out_good_record c ON c.order_detail_id = b.id; 

查询结果:

713278402284617792,722329309878140931,722329309878140949,722329309878140973,722329309878140939,715342356376936480,715342356376936482,715342356381130806,715342356376936484,715342356381130810,713278240841662516,713278240841662476,713278240841662520,715342356381130876,715342356381130940,715342356385325066,715342356385325132,715342356385325196,715342356385325260,715342356376936526,715342356381130812,715342356381130890,715342356381130964,744788201669005316,744788201669005380,744788201673199622,744788201669005330,744788201669005394,744788201752891404,744788201664811012,744788201669005344,744788201669005408,744788201752891418,744788201669005338,744788201669005410,744788201664811016,744788201669005354,744788201669005424,744788201664811030,744788201669005368,744788201673199616,744788201752891400,744788201669005312,745061736895352916,745061736891158544,745061736895352852,745061736895352930,745061736891158558,745061736895352866,745061736895352944,745061736891158572,745061736895352880,745061736895352958,74506173689115858

而实际上

SELECT
c.goods_detail_id
FROM
	air_out_order a
	LEFT JOIN air_out_order_detail b ON b.order_id = a.id
	LEFT JOIN air_out_good_record c ON c.order_detail_id = b.id;

的查询结果为:

713278402284617792
722329309878140931,722329309878140949,722329309878140973,722329309878140939
715342356376936480
715342356376936482
715342356381130806
715342356376936484
715342356381130810
713278240841662516
713278240841662476
713278240841662520
715342356381130876,715342356381130940,715342356385325066,715342356385325132,715342356385325196,715342356385325260,715342356376936526,715342356381130812,715342356381130890,715342356381130964
744788201669005316,744788201669005380,744788201673199622,744788201669005330,744788201669005394,744788201752891404,744788201664811012,744788201669005344,744788201669005408,744788201752891418
744788201669005338,744788201669005410,744788201664811016,744788201669005354,744788201669005424,744788201664811030,744788201669005368,744788201673199616,744788201752891400,744788201669005312
745061736895352916,745061736891158544,745061736895352852,745061736895352930,745061736891158558,745061736895352866,745061736895352944,745061736891158572,745061736895352880,745061736895352958,745061736891158586,745061736895352894,745061736891158536,745061736895352844,745061736895352908,745061736895352922,745061736891158550,745061736895352858,745061736895352936,745061736891158564,745061736895352872,745061736895352950,745061736891158578,745061736895352886,745061736895352964,745061736891158528,745061736895352836,745061736895352900,745061736895352914,745061736891158542
744788201669005318,744788201669005396,744788201669005334,744788201669005414,744788201669005352,744788201669005430,744788201664811022,744788201669005370,744788201752891394,744788201664811038
744788201664811020,744788201669005382,744788201752891416,744788201664811040,744788201669005400,744788201669005328,744788201669005420,744788201669005350,744788201673199618,744788201664811008
746171271546650637
746171271550844964
745061736895352842,745061736895352934,745061736895352862,745061736895352954,745061736891158548,745061736895352882,745061736891158568,745061736895352902,745061736895352832,745061736895352924
747357984740646912,747357984912613376,747357984782589952,747357984824532992,747357984652566528
747357984778395648
747357984753229824
745898989121159210,745898989108576268,745898989125353485,745898989116964869,745898989121159170,745898989121159184
745898989112770564,745898989121159168,745898989121159186,745898989121159202,745898989108576272,745898989125353481
745898989108576274,745898989116964877,745898989121159182,745898989121159206,745898989108576258,745898989116964865
745898989116964879
745898989112770562
745898989116964871,745898989121159180,745898989121159208,745898989108576260,745898989121159172,745898989121159194
745898989121159188,745898989125353477,745898989116964875,745898989121159198,745898989108576264,745898989121159178
747357984694509568,747357984904224768,747357984749035520,747357984807755776,747357984849698816,747357984644177920,747357984883253248,747357984715481088,747357984770007040,747357984828727296
747357984707092480,747357984795172864,747357984853893120,747357984895836160,747357984665149440,747357984736452608,747357984820338688,747357984866476032,747357984509960192,747357984916807680
745898989121159196
745898989121159200
762832940033040386
715342356385325082

要多得多,出现group_concat把数据给截断了,什么原因呢?

解决问题

由于group_concat有长度限制,默认1024个字符,

所以解决的办法也就是将group_concat有长度限制设置足够大即可。

1)临时解决方案:

在命令行运行

SET SESSION group_concat_max_len = 18446744073709551615;
set global max_allowed_packet = 2*1024*1024*10;

2)永久解决方案:

首先找到mysql的配置文件,设置如下配置

max_allowed_packet = 20M
group_concat_max_len = 18446744073709551615

总结

到此这篇关于mysql中GROUP_CONCAT函数使用技巧及问题详解的文章就介绍到这了,更多相关mysql GROUP_CONCAT函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql 8.0.17 安装配置方法图文教程

    mysql 8.0.17 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.17 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • phpmyadmin中为站点设置mysql权限的图文方法

    phpmyadmin中为站点设置mysql权限的图文方法

    在一个服务器上一般来讲都不止一个站点,更不止一个MySQL(和PHP搭配之最佳组合)数据库。
    2011-03-03
  • MySQL常用命令大全脚本之家总结

    MySQL常用命令大全脚本之家总结

    这篇文章主要介绍了MySQL常用命令,总结了经常使用的MySQL命令,需要的朋友可以参考下
    2014-02-02
  • 如何使用分区处理MySQL的亿级数据优化

    如何使用分区处理MySQL的亿级数据优化

    mysql在查询上千万级数据的时候,通过索引可以解决大部分查询优化问题。但是在处理上亿数据的时候,应该怎么解决,本文就是用分区来优化一下,感兴趣的一起来了解一下
    2021-06-06
  • mysql5.7的安装及Navicate长久免费使用的实现过程

    mysql5.7的安装及Navicate长久免费使用的实现过程

    这篇文章主要介绍了mysql5.7的安装及Navicate长久免费使用的实现过程,本文给大家分享问题及解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • MySQL视图简介及基本操作教程

    MySQL视图简介及基本操作教程

    这篇文章主要给大家介绍了关于MySQL视图简介及基本操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • mysql 将字段time按天/月/年分组

    mysql 将字段time按天/月/年分组

    表中有一个字段time,格式为Unix时间戳,现需要按照该字段统计每天的记录数并按天/月/年分组
    2014-07-07
  • 解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码

    解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码

    这篇文章给大家分享解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码.通过重新安装程序解决此问题,下面小编把问题记录及解决过程分享给大家,需要的朋友参考下吧
    2021-06-06
  • MySQL六种约束的示例详解

    MySQL六种约束的示例详解

    约束是作用于表中字段上的规则,用于限制存储在表中的数据。这篇文章主要为大家整理了一下MySQL中六种约束的用法,感兴趣的可以了解一下
    2023-02-02
  • 详解如何在阿里云服务器安装Mysql数据库

    详解如何在阿里云服务器安装Mysql数据库

    这篇文章主要介绍了详解如何在阿里云服务器安装Mysql数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论