如何在查询Products表时为每条记录添加同color_keyword的颜色列表
数据库层面实现同color_keyword颜色列表聚合方案
当然可以直接在数据库层面搞定这个需求,完全不用在Node.js里循环发起查询,而且连现有表结构都不用改!下面针对几种主流数据库给你具体的实现方案:
1. MySQL(5.7及以上版本)
MySQL自带GROUP_CONCAT函数,可以直接聚合同color_keyword下的所有color值:
子查询写法
SELECT p.*, (SELECT GROUP_CONCAT(DISTINCT color SEPARATOR ',') FROM Products WHERE color_keyword = p.color_keyword) AS same_keyword_colors FROM Products p;
JOIN分组写法
SELECT p.*, GROUP_CONCAT(DISTINCT p2.color SEPARATOR ',') AS same_keyword_colors FROM Products p LEFT JOIN Products p2 ON p.color_keyword = p2.color_keyword GROUP BY p.color_keyword, p.color; -- 需根据表的唯一标识(比如主键)分组,确保每条原记录保留
注:
DISTINCT用来去重重复的color值,SEPARATOR ','可以省略,因为默认分隔符就是逗号。
2. PostgreSQL
PostgreSQL使用STRING_AGG函数实现字符串聚合:
子查询写法
SELECT p.*, (SELECT STRING_AGG(DISTINCT color, ',') FROM Products WHERE color_keyword = p.color_keyword) AS same_keyword_colors FROM Products p;
JOIN分组写法
SELECT p.*, STRING_AGG(DISTINCT p2.color, ',') AS same_keyword_colors FROM Products p LEFT JOIN Products p2 ON p.color_keyword = p2.color_keyword GROUP BY p.color_keyword, p.color;
3. SQL Server
- 2017及以上版本:使用
STRING_AGG函数
SELECT p.*, (SELECT STRING_AGG(color, ',') WITHIN GROUP (ORDER BY color) FROM Products WHERE color_keyword = p.color_keyword) AS same_keyword_colors FROM Products p;
- 旧版本兼容方案:用
FOR XML PATH拼接字符串
SELECT p.*, STUFF((SELECT ',' + color FROM Products WHERE color_keyword = p.color_keyword FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS same_keyword_colors FROM Products p;
性能优化建议
如果你的数据量较大,可以给color_keyword字段添加索引,这样子查询或JOIN的匹配效率会大幅提升。
内容的提问来源于stack exchange,提问作者Alexander Seredenko
相关产品推荐
相关产品推荐

