如何在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
相关产品推荐
相关产品推荐

