You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:33:29