MySQL 在 Sequelize 中的聚合函数以及分组操作
阅读更多:MySQL 教程
什么是聚合函数?
在 MySQL 中,聚合函数用于对一组数据进行计算并返回一个单一的值。聚合函数包括以下几种:
- SUM
- AVG
- MAX
- MIN
- COUNT
以下是这些聚合函数在 Sequelize 中的使用方式。
Sequelize 中的聚合函数
首先,我们需要在 Sequelize 中使用一些内置的聚合函数。Sequelize 内置有以下聚合函数:
const { sequelize: {
functions: { fn },
Op },
} = require('sequelize');
// sum
fn('SUM', fn('column_name'), 'alias_name')
// avg
fn('AVG', fn('column_name'), 'alias_name')
// max
fn('MAX', fn('column_name'), 'alias_name')
// min
fn('MIN', fn('column_name'), 'alias_name')
// count
fn('COUNT', fn('column_name'), 'alias_name')
这是最基本的聚合函数。我们可以使用其中任意一个来对我们的查询结果进行计算。
示例
假设我们有一张名为 purchases 的表格,其数据如下:
id | item | price | quantity | user_id |
---|---|---|---|---|
1 | apple | 10.00 | 2 | 1 |
2 | orange | 15.00 | 1 | 2 |
3 | apple | 5.00 | 3 | 1 |
4 | banana | 12.00 | 2 | 3 |
5 | cherry | 20.00 | 1 | 2 |
使用 Sequelize,我们可以使用以下方法计算某种产品的总价:
const result = await models.Purchase.findAll({
attributes: [
[fn('SUM', fn('product_price')), 'total_price']
],
where: {
product_name: 'apple',
},
});
console.log('total price of apple:', result[0].dataValues.total_price);
这将打印出:
total price of apple: 20
我们也可以使用以下方法对用户进行分类,计算每个用户购买的总价:
const result = await models.Purchase.findAll({
attributes: [
'userId',
[fn('SUM', fn('product_price')), 'total_price']
],
group: ['userId'],
});
console.log(result.map(r => `{r.userId}:{r.dataValues.total_price}`));
这将打印出:
1: 30
2: 35
3: 24
Sequelize 中的分组操作
分组操作允许我们对结果进行分类,使得我们可以计算每组的聚合值。Sequelize 提供了一种简单的方法来实现这个功能:
const result = await models.Purchase.findAll({
attributes: [
'product_name',
[fn('SUM', fn('product_price')), 'total_price']
],
group: ['product_name'],
});
console.log(result.map(r => `{r.product_name}:{r.dataValues.total_price}`));
这将打印出:
apple: 25
banana: 12
cherry: 20
orange: 15
我们可以使用一个简单的查询语句来获得与此相同的结果:
SELECT product_name, SUM(product_price) AS total_price
FROM purchases
GROUP BY product_name;
总结
在 Sequelize 中使用聚合函数和分组操作允许我们更方便地计算结果,并对其进行分类。对于需要对大量数据进行计算的场景,这些功能可以大大减轻我们的负担。