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

如何在SQL子查询中将关联表整行转换为字符串数组返回

解决方案

更推荐使用JSON格式返回关联表数据,不需要手动做拼接拆分,PHP侧直接调用json_decode()就能解析为数组,稳定性远高于逗号分隔的字符串,可避免字段内容自带逗号导致拆分错误的问题。

不同数据库的实现方式

1. MySQL 5.7及以上版本

如果使用MySQL 8.0.19及更高版本,可以直接用JSON_OBJECT(*)直接将匹配行的全部字段转为JSON格式:

SELECT 
    product.*,
    (SELECT JSON_OBJECT(*) FROM category 
     WHERE product.category_id = category.category_id) AS category
FROM 
    product_table AS product
WHERE 
    product.id = 17

如果使用低于8.0.19的版本,手动指定需要返回的字段即可:

SELECT 
    product.*,
    (SELECT JSON_OBJECT(
        'id', id,
        'category_name', category_name,
        'category_description', category_description
    ) FROM category 
     WHERE product.category_id = category.category_id) AS category
FROM 
    product_table AS product
WHERE 
    product.id = 17

PHP侧拿到category字段的返回值后,直接调用json_decode($category, true)即可得到关联数组。

2. PostgreSQL

PostgreSQL原生支持行数据转JSON,写法更简单:

SELECT 
    product.*,
    (SELECT to_json(category) FROM category 
     WHERE product.category_id = category.category_id) AS category
FROM 
    product_table AS product
WHERE 
    product.id = 17

3. 逗号分隔字符串方案(不推荐)

如果一定要用逗号拼接的字符串格式,可以使用CONCAT_WS函数实现,注意该方案存在字段值自带逗号时拆分错误的风险:

SELECT 
    product.*,
    (SELECT CONCAT_WS(',', id, category_name, category_description) FROM category 
     WHERE product.category_id = category.category_id) AS category
FROM 
    product_table AS product
WHERE 
    product.id = 17

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:24:03