一、MYSQL在查询统计的时候怎么把其它字段的值取出来-group_concat函数
比如我们现在有一张文章表article,我们需要根据分章分类查询出各类文章有多少遍。简单的SQL如下(ar_cid是文章分类ID):
select ar_cid,count(*) as cidnum from ke_article group by ar_cid order by cidnum desc;
然而如果想在MYSQL查询的同时,想知道每个分类下的有哪些文章ID,怎么实现呢?注意是同时,而不是另外再执行SQL查询,如果你不知道这个group_concat这个函数,或许你真想不出好办法了。所以此时group_concat函数功能真的很强大。SQL如下:
select ar_cid,count(*) as cidnum,group_concat(id) as ids from ke_article group by ar_cid order by cidnum desc;
MySQL中的group_concat函数具有连接字段,使得多个值显示为一行,默认分隔符号是逗号, 并且在使用的时候还可以指定排序,完整的语法如下:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator 分隔符])
适合在做一些聚合查询的同时又要取出字段详细数据,这功能在使用时候还可以有更灵活的功能,比如上面的查询,如果我们想在知道ID的情况下还想知道另外一个字段的内容,并且要和文章ID一一对应起来,此时可以将另外一个字段也使用group_concat连接,取出来之后这两个字段的数据后以逗号分隔,它们就是一一对应的关系了。上面的SQL查询结果示例如下:
二、 小心mysql中的group_concat函数结果有大小限制
在查询mysql时,group_concat可以把结果中的字段以指定字符串连接起来,但在使用时一定要小心,mysql中的group_concat函数结果有大小限制,默认是1024字节。下面的SQL是执行一个带有group_concat函数的查询,计算得到group_concat函数得到的结果字段的大小,我的数据表比较大,总共有30多万条记录,type值只有4种,即每个type平均也有8万数据,看下面SQL和查询结果:
select type,allnum,length(ids) from (
select type,count(*) as allnum,group_concat(id) as ids from staff GROUP BY type order by FIELD(type,3,1,2,0) limit 4
) as temp;
查询结果截图:
因为每个type平均也有8万条数据,ID值肯定不只1024,可见group_concat的当前限制即是1024.通过mysql查询命令:
show variables like 'group_concat_max_len';
可看到当前的变量设置值为:1024,如下图:
而如果我们使用命令:set group_concat_max_len=2048; 修改这个配置值之后,上面的SQL查询结果也会变成相应的值。截图如下:
如果你有权限可以执行:SET GLOBAL group_concat_max_len = ***; 本文上方关于group_concat函数的介绍,group_concat除了上面的基本功能外,还可以实现排序和指定连接符号、连接前进行排序处理等。SQL示例如下:
select type,count(*) as allnum,group_concat(id separator ':') as ids from staff GROUP BY type;
select type,count(*) as allnum,group_concat(id order by id desc separator ':') as ids from staff GROUP BY type;