如何用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;
关键改动说明
分组逻辑修正:
改为按工单ID(t.id)分组,同时将所有与工单一对一关联的字段(用户名称、状态、优先级等)加入GROUP BY,确保每个工单对应唯一一行结果。自定义字段聚合:
用CONCAT(cf.label, ': ', cfv.value)将单个自定义字段的标签和值拼接成“标签: 值”格式,再通过GROUP_CONCAT聚合同工单的所有自定义字段,用分隔符区分不同字段。关联方式调整:
将消息和自定义字段的关联改为LEFT JOIN,避免过滤掉没有符合条件消息或自定义字段的工单;同时调整WHERE条件,允许消息记录为空(m.user_id IS NULL),确保所有工单都能被保留。表别名简化:
为表添加了简短别名(如t代表工单表),让SQL更易读。
内容的提问来源于stack exchange,提问作者Nige
相关产品推荐
相关产品推荐

