当前位置: 首页 > news >正文

Mysql中GROUP_CONCAT分组聚合函数的使用以及示例

一、函数定义与基础语法

GROUP_CONCAT(
[DISTINCT] 字段名
[ORDER BY 排序字段 [ASC|DESC]]
[SEPARATOR '分隔符']
)

默认行为:连接非NULL值,默认逗号分隔

长度限制:受group_concat_max_len控制(默认1024字节)

二、核心使用场景与示例

1. 基础字符串连接

-- 连接部门所有员工姓名
SELECTdept_id,GROUP_CONCAT(employee_name) AS members
FROM employees
GROUP BY dept_id;

输出示例:

| dept_id | members          |
|---------|------------------|
| 1       | 张三,李四,王五    |

2. 去重连接(DISTINCT)

-- 连接不重复的城市名
SELECTcountry,GROUP_CONCAT(DISTINCT city) AS cities
FROM locations
GROUP BY country;

3. 自定义排序(ORDER BY)

-- 按入职时间倒序连接
SELECTdept_id,GROUP_CONCAT(employee_nameORDER BY hire_date DESCSEPARATOR ' | ') AS seniority_list
FROM employees
GROUP BY dept_id;

4. 多字段组合

-- 连接姓名+工号
SELECTproject_id,GROUP_CONCAT(CONCAT(name,'(',emp_id,')')SEPARATOR '; ') AS project_team
FROM project_members
GROUP BY project_id;

三、高级应用技巧

1. 处理NULL值

-- 跳过NULL值(默认行为)
GROUP_CONCAT(IFNULL(field, 'N/A'))-- 包含NULL占位
GROUP_CONCAT(field SEPARATOR '|')

2. 动态设置长度

-- 会话级调整(最大1MB)
SET SESSION group_concat_max_len = 1024 * 1024;

3. 嵌套JSON输出(MySQL 8.0+)

SELECTdept_id,JSON_ARRAYAGG(JSON_OBJECT('name', name, 'id', emp_id)) AS member_json
FROM employees
GROUP BY dept_id;

4. 与CONCAT_WS配合

-- 智能处理空值
SELECTGROUP_CONCAT(CONCAT_WS(':',NULLIF(first_name,''),NULLIF(last_name,''))SEPARATOR '\n') AS full_names
FROM users;

五、业务使用示例

  <select id= "pageAlarmEvent" resultMap= "PageResultMap">selectae.id,ae.event_name,ae.rule_name,ae.monitoring,ae.warehouse_id,ae.level,ar.time_interval,GROUP_CONCAT(an.title ORDER BY aen.id SEPARATOR ', ') AS notificationIdList,ae.notification_time,ae.start_time,ae.end_time,ae.is_next,ae.event_status,ae.update_user_id,ae.update_timeFROMalarm_event aeLEFT JOINalarm_rule ar ON ae.rule_id = ar.idLEFT JOINalarm_event_notification aen ON ae.id = aen.event_id and aen.is_delete = 0LEFT JOINalarm_notification an ON aen.notification_id = an.id<where>ae.is_delete = 0AND ae.company_id=#{companyId}<!-- 添加筛选条件 --><if test="queryParam.warehouseId != null and queryParam.warehouseId != ''">AND ae.warehouse_id  = #{queryParam.warehouseId}</if><if test="queryParam.tankId != null">AND ae.tank_id  = #{queryParam.tankId}</if><if test="queryParam.level != null">AND ae.level  = #{queryParam.level}</if><if test="queryParam.eventName != null and queryParam.eventName != ''">AND ae.event_name  LIKE CONCAT('%', #{queryParam.eventName}, '%')</if><if test="queryParam.eventStatus != null">AND ae.event_status  = #{queryParam.eventStatus}</if></where>GROUP BYae.id,ae.event_name,ae.rule_name,ae.monitoring,ae.level,ae.warehouse_id,ar.time_interval,ae.notification_time,ae.start_time,ae.end_time,ae.is_next,ae.event_status,ae.update_user_id,ae.update_time<!-- 添加排序条件 -->ORDER BY ae.update_time  DESC</select>


场景描述

某告警事件ID= "event_123"关联了3条通知:

aen.id an.title

88 温度过高

92 压力异常

95 阀门泄漏

执行过程

按aen.id 排序得到序列:88 → 92 → 95

提取对应an.title :温度过高 → 压力异常 → 阀门泄漏

用分隔符连接:"温度过高, 压力异常, 阀门泄漏"

最终结果

{
"id": "event_123",
"notificationIdList": "温度过高, 压力异常, 阀门泄漏"
}

http://www.dtcms.com/a/410714.html

相关文章:

  • 2025无人机林业行业场景解决方案
  • 化肥网站模板青岛建设集团 招聘信息网站
  • 【在Ubuntu 24.04.2 LTS上安装Qt 6.9.2】
  • 家居企业网站建设渠道百度如何推广广告
  • 《MLB美职棒》运动员体质特征·棒球1号位
  • AI 应用和工业软件
  • 网站备案空壳网站制作找
  • 洛谷 P3388:【模板】割点(割顶)← Tarjan 算法
  • DeepSeek“问道”-第二章:问算法 —— 阴与阳如何在我内部舞蹈?
  • 重学JS-009 --- JavaScript算法与数据结构(九)Javascript 方法
  • Python项目中ModuleNotFoundError与FileNotFoundError的深度解决指南(附实战案例)
  • LeetCode:61.分割回文串
  • 坑: console.log,对象引用机制
  • 网站模板找超速云建站学校网站建设是什么意思
  • 做购物网站的业务微信公众号开发网站开发
  • Matlab通过GUI实现点云的均值滤波(附最简版)
  • 应用部署(后端)
  • 手机网站吧怎样做一个app平台
  • 用AI重塑电商,京东零售发布电商创新AI架构体系Oxygen
  • csv、pdf文件预览uniapp-H5
  • Wiley出版社WileyNJDv5_Template模板编译不能生成PDF解决办法
  • 蓝色网站配色方案贵州省城乡和住房建设厅网站首页
  • 广州微网站建设咨询网站建设500错误代码
  • 凡科建站建网站网络建设公司排行
  • 编写 GStreamer 插件2:编写插件的基础知识(二)
  • 收录网站的平台有哪些上海建设网站浦东新区污水管网工程
  • 学校门户网站建设必要性爱趣网
  • 深入用户评测:腾讯CodeBuddy打造用户首选的AI全栈开发工具
  • 深圳网站设计制作建设微信做单页的网站
  • 基于微信小程序高仿背单词消除游戏