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

PostgreSQL行转数组问题:NestJS原生查询未实现聚合效果

解决PostgreSQL聚合粉丝名为单行数组的问题

你的问题出在GROUP BY子句的多余字段:原查询里把ufe.id和fct.id也加入了分组条件,这两个是关联表的主键,每个粉丝对应唯一的ufe.id和fct.id,导致每个粉丝都被分成单独的组,ARRAY_AGG只能聚合单个值,最终返回多行结果。

修正后的SQL查询

SELECT
    u.id,
    ARRAY_AGG(DISTINCT fct.fanname) AS name
FROM
    users u
    LEFT JOIN user_fans ufe ON ufe.fanid = u.id
    LEFT JOIN fans fct ON fct.id = ufe.fanid
WHERE
    u.id = 1
GROUP BY
    u.id
ORDER BY
    u.id

关键修改点

  1. 移除多余分组字段:只保留u.id作为分组条件,确保同一用户的所有粉丝都被分到同一个组中
  2. 添加DISTINCT到ARRAY_AGG:避免同一个粉丝名因重复关联被多次加入数组(如果业务上不会出现重复关联,可以省略)
  3. 去掉SELECT DISTINCT:GROUP BY已经按用户id分组,无需额外去重

NestJS中使用原生查询的示例代码

// 以TypeORM的Repository为例
async getAggregatedFans(userId: number) {
  const sql = `
    SELECT
      u.id,
      ARRAY_AGG(DISTINCT fct.fanname) AS name
    FROM
      users u
      LEFT JOIN user_fans ufe ON ufe.fanid = u.id
      LEFT JOIN fans fct ON fct.id = ufe.fanid
    WHERE
      u.id = $1
    GROUP BY
      u.id
    ORDER BY
      u.id
  `;
  const result = await this.usersRepository.query(sql, [userId]);
  return result[0]; // 仅返回单行结果
}

注意:如果user_fans表的关联逻辑是用户关联粉丝(即ufe.userid = u.id,ufe.fanid = fct.id),请调整JOIN条件为LEFT JOIN user_fans ufe ON ufe.userid = u.id,否则当前的关联逻辑可能不符合业务实际。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:01:04