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
关键修改点
- 移除多余分组字段:只保留
u.id作为分组条件,确保同一用户的所有粉丝都被分到同一个组中 - 添加DISTINCT到ARRAY_AGG:避免同一个粉丝名因重复关联被多次加入数组(如果业务上不会出现重复关联,可以省略)
- 去掉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
相关产品推荐
相关产品推荐

