Sequelize选择多列仅按一列分组报错问题咨询
解决Sequelize分组查询时的列聚合错误
错误原因
你遇到的是PostgreSQL(从错误提示判断)的ONLY_FULL_GROUP_BY模式限制:当使用GROUP BY时,SELECT列表里的非聚合列必须要么出现在GROUP BY子句中,要么被聚合函数(比如COUNT、MIN、MAX)包裹。你的查询里选了id列,但既没把它加入GROUP BY,也没对它做聚合,所以触发了这个错误。
解决方案
根据你的实际需求选择对应方案:
方案1:不需要返回id列(最常用)
如果业务只需要分类名称和对应的计数,直接从attributes里移除'id'即可:
const categories = await Course.findAll({ attributes: [ 'category', [Sequelize.fn('COUNT', Sequelize.col('category')), 'count'], ], raw: true, group: ['Course.category'] })
方案2:需要返回分组内的某一个id
如果必须返回每个分类对应的某个id(比如分组里最小/最大的id),用聚合函数包裹id并给它起别名:
const categories = await Course.findAll({ attributes: [ [Sequelize.fn('MIN', Sequelize.col('id')), 'category_id'], // 也可以用MAX取最大id 'category', [Sequelize.fn('COUNT', Sequelize.col('category')), 'count'], ], raw: true, group: ['Course.category'] })
方案3:关闭数据库的严格分组模式(不推荐)
如果一定要保留id且不做聚合,可以临时关闭PostgreSQL的ONLY_FULL_GROUP_BY约束,但这不符合SQL标准,会导致返回的id是随机值,数据不可靠。可以在查询时添加dialect配置:
const categories = await Course.findAll({ attributes: [ 'id', 'category', [Sequelize.fn('COUNT', Sequelize.col('category')), 'count'], ], raw: true, group: ['Course.category'], dialectOptions: { query: { options: { enableOnlyFullGroupBy: false } } } })
注意:该方法可能因Sequelize或PostgreSQL版本不同出现兼容性问题,且会破坏数据一致性,谨慎使用。
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

