使用Group_Concat按会话获取事件,如何生成指定格式及JSON结果?
按会话分组获取事件并生成指定JSON格式的实现方案
没问题,我来帮你搞定这两个需求!下面分两部分详细说明:
一、数据库按会话分组生成指定格式结果
假设你的表名为events,不同数据库的实现略有差异,但核心思路都是分组+编号+字符串拼接:
MySQL 实现
用GROUP_CONCAT和窗口函数ROW_NUMBER()就能直接得到你要的格式:
SELECT Session, GROUP_CONCAT( CONCAT('Event', ROW_NUMBER() OVER (PARTITION BY Session ORDER BY id), ':', Event) SEPARATOR ',' ) AS Events FROM events GROUP BY Session -- 可选:按Morning→Afternoon→Evening的顺序排序 ORDER BY FIELD(Session, 'Morning', 'Afternoon', 'Evening');
ROW_NUMBER() OVER (PARTITION BY Session ORDER BY id):给每个会话内的事件按ID排序并生成序号,这样就能得到Event1、Event2的格式GROUP_CONCAT:把同一会话的所有事件拼接成逗号分隔的字符串ORDER BY FIELD(...):确保结果按你期望的会话顺序输出
PostgreSQL 实现
PostgreSQL用STRING_AGG代替GROUP_CONCAT,排序逻辑用CASE:
SELECT Session, STRING_AGG( CONCAT('Event', ROW_NUMBER() OVER (PARTITION BY Session ORDER BY id), ':', Event), ',' ) AS Events FROM events GROUP BY Session ORDER BY CASE Session WHEN 'Morning' THEN 1 WHEN 'Afternoon' THEN 2 WHEN 'Evening' THEN 3 END;
二、生成指定格式的JSON结果
这个需求需要结合编程语言来实现,核心是从数据库查询数据后,构造符合要求的对象列表再序列化JSON。下面以Python和Java为例:
Python 示例(用MySQL驱动)
import pymysql import json # 连接数据库(替换成你的数据库信息) conn = pymysql.connect( host="your_host", user="your_username", password="your_password", database="your_db" ) cursor = conn.cursor() # 查询带序号的事件数据 query = """ SELECT Session, Event, ROW_NUMBER() OVER (PARTITION BY Session ORDER BY id) AS event_num FROM events ORDER BY FIELD(Session, 'Morning', 'Afternoon', 'Evening'), event_num; """ cursor.execute(query) results = cursor.fetchall() # 构造JSON结构(示例字段值可根据实际需求修改) json_list = [] for session, event, event_num in results: json_item = { "program": 821, "event": 88, "training": 828, "start": "7:15 AM", "end": "7:50 AM", "instructor": 922, "location": 955, "participant_id": 451, "session": session, # 填入查询到的会话名称 "day": 445, "intensity": "••" } json_list.append(json_item) # 转成格式化的JSON字符串 json_result = json.dumps(json_list, indent=2) print(json_result) # 关闭连接 cursor.close() conn.close()
Java 示例(用JDBC+Jackson)
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class EventJsonGenerator { public static void main(String[] args) throws Exception { // 数据库连接信息 String url = "jdbc:mysql://your_host/your_db"; String user = "your_username"; String password = "your_password"; List<EventDto> eventList = new ArrayList<>(); String query = """ SELECT Session, Event, ROW_NUMBER() OVER (PARTITION BY Session ORDER BY id) AS event_num FROM events ORDER BY FIELD(Session, 'Morning', 'Afternoon', 'Evening'), event_num; """; // 查询数据并构造DTO try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement stmt = conn.prepareStatement(query); ResultSet rs = stmt.executeQuery()) { while (rs.next()) { EventDto dto = new EventDto(); dto.setProgram(821); dto.setEvent(88); dto.setTraining(828); dto.setStart("7:15 AM"); dto.setEnd("7:50 AM"); dto.setInstructor(922); dto.setLocation(955); dto.setParticipantId(451); dto.setSession(rs.getString("Session")); dto.setDay(445); dto.setIntensity("••"); eventList.add(dto); } } // 序列化为格式化JSON ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); String jsonResult = mapper.writeValueAsString(eventList); System.out.println(jsonResult); } // 对应的DTO类 static class EventDto { private int program; private int event; private int training; private String start; private String end; private int instructor; private int location; private int participantId; private String session; private int day; private String intensity; // Getter和Setter方法 public int getProgram() { return program; } public void setProgram(int program) { this.program = program; } public int getEvent() { return event; } public void setEvent(int event) { this.event = event; } public int getTraining() { return training; } public void setTraining(int training) { this.training = training; } public String getStart() { return start; } public void setStart(String start) { this.start = start; } public String getEnd() { return end; } public void setEnd(String end) { this.end = end; } public int getInstructor() { return instructor; } public void setInstructor(int instructor) { this.instructor = instructor; } public int getLocation() { return location; } public void setLocation(int location) { this.location = location; } public int getParticipantId() { return participantId; } public void setParticipantId(int participantId) { this.participantId = participantId; } public String getSession() { return session; } public void setSession(String session) { this.session = session; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public String getIntensity() { return intensity; } public void setIntensity(String intensity) { this.intensity = intensity; } } }
内容的提问来源于stack exchange,提问作者Assad Nazar
相关产品推荐
相关产品推荐

