Sequelize查询中order与limit参数失效问题求助
问题原因与解决方案
Sequelize的count方法在搭配group选项使用时,不会识别limit和order参数——这是该方法的设计逻辑导致的,因为此时count的作用是返回所有分组的计数集合,而非支持分页、排序的查询结果。
另外你生成的SQL里count(DISTINCT(id))也不符合预期,因为count方法的distinct参数传入字段名时,在部分Sequelize版本中不会正确映射为COUNT(DISTINCT 字段),而是默认统计去重后的主键(id)数量。
修正后的代码
改用findAll方法手动定义聚合查询,这样limit和order就能正常生效:
const pkers = await db.Pkrecords.findAll({ attributes: [ 'pker', // 按需选择聚合逻辑: // 统计每个pker的总记录数用 COUNT(*) // 统计每个pker的去重id数用 COUNT(DISTINCT id) [db.Sequelize.fn('COUNT', '*'), 'count'] ], group: ['pker'], limit: 3, order: [['pker', 'DESC']], where: { date: { [Op.gt]: dateWeekStart, [Op.lt]: dateWeekEnd, }, }, });
如果你的需求是统计每个分组内去重的pker数量(注:group by pker后每个分组的pker唯一,结果会是1),可以修改聚合函数:
[db.Sequelize.fn('COUNT', db.Sequelize.fn('DISTINCT', db.Sequelize.col('pker'))), 'count']
结果处理
你可以遍历返回的模型实例,格式化得到所需数据:
const formattedResult = pkers.map(item => ({ pker: item.pker, count: item.get('count') }));
内容的提问来源于stack exchange,提问作者George K
相关产品推荐
相关产品推荐

