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

MySQL按主ID单行返回,子表结果合并至单列的实现方案

解决方案:合并关联子表的多条记录为逗号分隔值

要实现你需要的结果——将主表hrms_emp_type对应的子表employment_types的多条description值合并成逗号分隔的字符串,我们可以利用MySQL的GROUP_CONCAT()聚合函数,配合关联查询来完成。

1. 表结构与示例数据(匹配你的场景)

假设你的表结构如下:

CREATE TABLE hrms_emp_type (
  salaryProcessID INT PRIMARY KEY
);

CREATE TABLE employment_types (
  id INT PRIMARY KEY AUTO_INCREMENT,
  salaryProcessID INT,
  description VARCHAR(50),
  FOREIGN KEY (salaryProcessID) REFERENCES hrms_emp_type(salaryProcessID)
);

-- 插入示例数据
INSERT INTO hrms_emp_type VALUES (1360), (1397), (1557), (1566);
INSERT INTO employment_types VALUES
(1, 1360, 'General'),
(2, 1397, 'Consultant'),
(3, 1557, 'General'),
(4, 1557, 'Trainee'),
(5, 1557, 'Consultant'),
(6, 1566, 'General'),
(7, 1566, 'Trainee');

2. 实现查询的SQL语句

下面的查询会关联两张表,将每个salaryProcessID对应的所有description合并成逗号分隔的字符串:

SELECT 
  het.salaryProcessID,
  GROUP_CONCAT(et.description SEPARATOR ', ') AS description
FROM hrms_emp_type het
LEFT JOIN employment_types et ON het.salaryProcessID = et.salaryProcessID
GROUP BY het.salaryProcessID
ORDER BY het.salaryProcessID;

3. 语句解释

  • LEFT JOIN:确保主表中的每个salaryProcessID都会被返回,即使子表中没有对应记录(这种情况下description会显示为NULL)。
  • GROUP_CONCAT(et.description SEPARATOR ', '):将同一salaryProcessID下的所有description值用, 分隔拼接成一个字符串。如果不指定SEPARATOR,默认会用无空格的逗号分隔,这里我们设置成带空格的格式来匹配你的示例。
  • GROUP BY het.salaryProcessID:按主表的salaryProcessID分组,确保每个ID只返回一行合并后的结果。
  • ORDER BY:让结果按salaryProcessID排序,和你的示例输出顺序一致。

4. 查询结果

执行上述语句后,你会得到和示例完全一致的输出:

salaryProcessID | description
1360            | General
1397            | Consultant
1557            | General, Trainee, Consultant
1566            | General, Trainee

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:13:09