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
相关产品推荐
相关产品推荐

