如何将多表关联查询结果合并为单行数组格式?
如何将关联查询的多行结果合并为单行(含字符串拼接或数组形式)
首先先纠正你原SQL里的一个小错误:关联languages表时,你写的是lang.id = ld.tag_id,但你的关联表lang_dev里的字段是lang_id,所以应该改成lang.id = ld.lang_id,不然查询会无法正确关联语言表哦。
接下来分两种场景满足你的需求:
1. SQL层面实现逗号分隔的单行结果
如果你希望直接通过SQL得到java, php这样的拼接字符串结果,可以用数据库自带的字符串聚合函数,不同数据库的函数略有不同:
针对MySQL/MariaDB
使用GROUP_CONCAT函数,配合GROUP BY分组即可:
SELECT dev.id, dev.name, GROUP_CONCAT(lang.name SEPARATOR ', ') AS lang_name FROM developers as dev LEFT JOIN lang_dev as ld ON dev.id = ld.dev_id LEFT JOIN languages as lang ON lang.id = ld.lang_id WHERE dev.id = 1 GROUP BY dev.id, dev.name;
这个查询会直接返回你期望的单行结果:
id | name | lang_name 1 | John | java, php
如果需要去重或者排序,可以在GROUP_CONCAT里加参数,比如GROUP_CONCAT(DISTINCT lang.name ORDER BY lang.name SEPARATOR ', ')。
其他数据库的替代方案
- PostgreSQL:用
STRING_AGG(lang.name, ', ') - SQL Server:用
STRING_AGG(lang.name, ', ') WITHIN GROUP (ORDER BY lang.name) - Oracle:用
LISTAGG(lang.name, ', ') WITHIN GROUP (ORDER BY lang.name)
2. 应用层实现数组形式的结果
数据库本身返回的是字符串,要得到数组格式的结果,需要在应用代码里做进一步处理。这里以PHP为例(其他语言逻辑类似):
// 假设使用PDO连接数据库 $db = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password'); // 执行聚合查询 $stmt = $db->prepare(" SELECT dev.id, dev.name, GROUP_CONCAT(lang.name) AS lang_name FROM developers as dev LEFT JOIN lang_dev as ld ON dev.id = ld.dev_id LEFT JOIN languages as lang ON lang.id = ld.lang_id WHERE dev.id = ? GROUP BY dev.id, dev.name "); $stmt->execute([1]); $row = $stmt->fetch(PDO::FETCH_ASSOC); // 将拼接的字符串转为数组 if (!empty($row['lang_name'])) { $row['lang_name'] = explode(',', $row['lang_name']); } else { // 处理该开发者没有关联语言的情况 $row['lang_name'] = []; } // 输出结果 print_r($row);
执行后会得到你想要的数组结构:
Array ( [id] => 1 [name] => John [lang_name] => Array ( [0] => java [1] => php ) )
内容的提问来源于stack exchange,提问作者Ralf Gerald
相关产品推荐
相关产品推荐

