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

如何用GROUP_CONCAT实现MySQL单工单数据单行输出?

解决方案

核心问题是你的GROUP BY条件错误——按自定义字段标签分组会导致不同工单但同标签的记录被合并,进而跨工单拼接消息。要实现每个工单一行数据,必须按工单唯一ID分组,同时对消息和自定义字段分别用GROUP_CONCAT聚合同工单的多条关联记录。

修改后的SQL语句

SELECT 
    ROW_NUMBER() OVER (ORDER BY t.id) AS 'Row number',
    t.id AS 'ID',
    DATE_FORMAT(t.date, "%d/%m/%Y") AS 'Date raised',
    u.name AS 'Raised by',
    t.code AS 'Code',
    t.subject AS 'Subject',
    s.name AS 'Status',
    p.name AS 'Priority',
    GROUP_CONCAT(m.message SEPARATOR '  |  ') AS 'Messages',
    GROUP_CONCAT(CONCAT(cf.label, ': ', cfv.value) SEPARATOR '  |  ') AS 'Custom fields',
    DATE_FORMAT(t.closed, "%d/%m/%Y") AS 'Date closed'
FROM
    sgj4z_rsticketspro_tickets t
    INNER JOIN sgj4z_users u ON t.customer_id = u.id
    INNER JOIN sgj4z_rsticketspro_statuses s ON t.status_id = s.id
    INNER JOIN sgj4z_rsticketspro_priorities p ON t.priority_id = p.id
    LEFT JOIN sgj4z_rsticketspro_custom_fields_values cfv ON t.id = cfv.ticket_id
    LEFT JOIN sgj4z_rsticketspro_ticket_messages m ON t.id = m.ticket_id
    LEFT JOIN sgj4z_rsticketspro_custom_fields cf ON cfv.custom_field_id = cf.id
WHERE 
    m.user_id != "-1" OR m.user_id IS NULL
GROUP BY 
    t.id, u.name, s.name, p.name, t.code, t.subject, t.date, t.closed;

关键改动说明

  1. 分组逻辑修正:
    改为按工单ID(t.id)分组,同时将所有与工单一对一关联的字段(用户名称、状态、优先级等)加入GROUP BY,确保每个工单对应唯一一行结果。

  2. 自定义字段聚合:
    用CONCAT(cf.label, ': ', cfv.value)将单个自定义字段的标签和值拼接成“标签: 值”格式,再通过GROUP_CONCAT聚合同工单的所有自定义字段,用分隔符区分不同字段。

  3. 关联方式调整:
    将消息和自定义字段的关联改为LEFT JOIN,避免过滤掉没有符合条件消息或自定义字段的工单;同时调整WHERE条件,允许消息记录为空(m.user_id IS NULL),确保所有工单都能被保留。

  4. 表别名简化:
    为表添加了简短别名(如t代表工单表),让SQL更易读。

内容的提问来源于stack exchange,提问作者Nige

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:17:15