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

如何在查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:46:37