MySQL中group_concat函数 --- 很有用的一个用来查询出所有group by 分组后所有 同组内的 内容
2015-03-07 14:47
615 查看
本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) 。 MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 基本查询 mysql> select * from aa; +------+------+ | id| name | +------+------+ |1 | 10| |1 | 20| |1 | 20| |2 | 20| |3 | 200 | |3 | 500 | +------+------+ 6 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔(默认) mysql> select id,group_concat(name) from aa group by id; +------+--------------------+ | id| group_concat(name) | +------+--------------------+ |1 | 10,20,20| |2 | 20 | |3 | 200,500| +------+--------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,分号分隔 mysql> select id,group_concat(name separator ';') from aa group by id; +------+----------------------------------+ | id| group_concat(name separator ';') | +------+----------------------------------+ |1 | 10;20;20 | |2 | 20| |3 | 200;500 | +------+----------------------------------+ 3 rows in set (0.00 sec) 以id分组,把去冗余的name字段的值打印在一行, 逗号分隔 mysql> select id,group_concat(distinct name) from aa group by id; +------+-----------------------------+ | id| group_concat(distinct name) | +------+-----------------------------+ |1 | 10,20| |2 | 20 | |3 | 200,500 | +------+-----------------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序 mysql> select id,group_concat(name order by name desc) from aa group by id; +------+---------------------------------------+ | id| group_concat(name order by name desc) | +------+---------------------------------------+ |1 | 20,20,10 | |2 | 20| |3 | 500,200| +------+---------------------------------------+ 3 rows in set (0.00 sec)
有长度限制的,长度设置 请看 group_concat的长度设置链接。
简单用法:
SET GLOBAL group_concat_max_len=102400;后直接跟包含group_concat 的sql语句即可。(全局 查询 的设置,只要设置,这个mysql服务器 下 这儿长度就永久设置成这个值。 )
SET SESSION group_concat_max_len=102400;后直接跟包含group_concat 的sql语句即可。(一次session查询 的设置,只会在同一个session 下的查询才会生效 )
注:以上举例都是将分完组后每组里数据 合并到一行,即结果记录还是根据有几个组 ,结果记录 就有几条记录。 那怎么样 才能 把 分完组后的几条记录 也最终合并到一行呢?
解决思路,可以将分完组后的记录 再次作为临时表,然后附加一个相同值的字段,然后再重新分组合并即可。如下:
将历练中低级、中级、高级 三个类型下的最高npc 的id 合并 到一行,这怎么做呢,根据上表说明,解决脚本如下:
@SELECT MAX(n_id) AS nid,n_type FROM dict_dream_template GROUP BY n_type; 结果
nid n_type ------- -------- 1500008 1 2500008 2 3010049 3
可以看出结果记录中 类型有3个组,而且每组 最大的npc 的id 也查出来了。那现在怎么样才能把 这三个组的最大npc 的id 合并到一组,很简单,把这个结果记录当成一个表重新附加个相同字段:
@SELECT MAX(n_id) AS nid,n_type,1 AS addsame FROM dict_dream_template GROUP BY n_type;
nid n_type addsame ------- ------ --------- 1500008 1 1 2500008 2 1 3010049 3 1
可以看出上边给查询结果已经附加了一个值皆为1的 addsame 零时别名字段,那下边把这个结果当成一个表,给表起个别名 就可以重新 按照 addsame分组 查询 然后合并了
@SELECT GROUP_CONCAT(nid),GROUP_CONCAT(n_type) FROM (SELECT MAX(n_id) AS nid,n_type,1 AS addsame FROM dict_dream_template GROUP BY n_type) t GROUP BY addsame;
group_concat(nid) GROUP_CONCAT(n_type) addsame ----------------------- -------------------- --------- 1500008,2500008,3010049 1,2,3 1
可以看出 上边已经 将上一步查询结果 合并好了,这个结果就是我最终要的数据,即 将分过组后的每组记录给合并 到一行,即最终结果记录里就一行数据。
相关文章推荐
- mysql 分组查询以及显示各个分组所有的温度和时间要用GROUP_CONCAT
- MySQL中group_concat函数,用符号连接查询分组里字段值
- MySQL查询所有供应商和其任意一个产品 - Group by的使用
- MySQL中的CONCAT、CONCAT_WS、GROUP_CONCAT函数,实现多行和多列的内容放在一个单元格内
- MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?
- MySQL——关于MySQL分组查询group by和order by获取最新时间内容的方法
- mysql 分组统计(直播内容状态,带上内容id),count case when group_concat sql
- MySQL分组查询时出现错误SELECT list is not in GROUP BY ;this is incompatible with sql_mode=only_full_group_by
- mysql之分组查询group by
- MySQL对数据表进行分组查询(GROUP BY)
- mysql如何查询一个表中所有字段的名字
- mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法。
- mysql查询中group by语句中出现sql_mode=only_full_group_by
- MySQL-分组查询(GROUP BY)及二次筛选(HAVING)
- MySQL中使用group by进行分组时,子查询中order by失效的问题
- MySQL中group_concat函数-和group by配合使用
- 记录一个mysql按日期分组统计的查询
- 记录一个mysql按日期分组统计的查询
- MySQL分组查询Group By实现原理详解
- MySQL分组查询Group By实现原理详解