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

如何在Sequelize与Node.js中使用GROUP BY子句

在Sequelize + Node.js中实现GROUP BY分组统计

先明确我们要实现的SQL逻辑:从red_cross_vvts表按volunteer_type_id分组,统计每组的志愿者数量,对应原生SQL如下:

SELECT COUNT(volunteer_id) as countVolunteer, volunteer_type_id 
FROM `red_cross_vvts`
GROUP BY volunteer_type_id;

以下是在Sequelize中对应的实现方式,假设你已经通过Sequelize定义了对应表的模型(示例中模型名为RedCrossVvt):

基础实现方式

使用findAll方法,通过attributes指定聚合字段和分组字段,配合group选项完成分组:

const { Sequelize } = require('sequelize');
const RedCrossVvt = require('./models/redCrossVvt'); // 导入你的模型

async function getVolunteerCountByType() {
  const result = await RedCrossVvt.findAll({
    attributes: [
      'volunteer_type_id',
      // 调用COUNT聚合函数,指定统计字段并设置别名
      [Sequelize.fn('COUNT', Sequelize.col('volunteer_id')), 'countVolunteer']
    ],
    // 指定分组字段,与SQL中的GROUP BY一致
    group: ['volunteer_type_id']
  });

  return result;
}

返回原始数据对象

默认返回的是Sequelize模型实例,如果你需要纯JSON格式的数据,可以添加raw: true选项:

const result = await RedCrossVvt.findAll({
  attributes: [
    'volunteer_type_id',
    [Sequelize.fn('COUNT', Sequelize.col('volunteer_id')), 'countVolunteer']
  ],
  group: ['volunteer_type_id'],
  raw: true // 返回原始数据对象,而非模型实例
});

带过滤条件的分组统计

如果需要先过滤数据再分组统计,直接添加where选项即可:

const result = await RedCrossVvt.findAll({
  attributes: [
    'volunteer_type_id',
    [Sequelize.fn('COUNT', Sequelize.col('volunteer_id')), 'countVolunteer']
  ],
  where: {
    // 示例:只统计状态为活跃的志愿者
    status: 'active'
  },
  group: ['volunteer_type_id'],
  raw: true
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:20:27