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

