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

如何将多表关联查询结果合并为单行数组格式?

如何将关联查询的多行结果合并为单行(含字符串拼接或数组形式)

首先先纠正你原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:09