MySQL SUM 聚合函数和 GROUP BY 子句的查询操作
在 Sequelize 中实现 MySQL 的 SUM 聚合函数和 GROUP BY 子句的查询操作。
阅读更多:MySQL 教程
什么是 SUM 和 GROUP BY
SUM 是一个聚合函数,用于计算数值字段的总和。它可以与 GROUP BY 子句一起使用,将结果按照分组分类,再对每组数据进行求和操作。
例如,我们有一个保存订单和商品价格的表 orders,其中两列为 price 和 quantity。我们可以按照商品名字分组,计算每类商品的总销售额,代码如下:
const { Order } = require('./models');
Order.findAll({
attributes: [
'name',
[sequelize.fn('SUM', sequelize.col('price * quantity')), 'total_sales']
],
group: ['name']
})
该查询可生成如下的 SQL 语句:
SELECT name, SUM(price * quantity) AS total_sales
FROM orders
GROUP BY name
实现 SUM 和 GROUP BY
Sequelize 提供了 fn 函数和 col 函数,来实现类似 SQL 的聚合函数操作。
fn 函数用于定义 SQL 函数,例如 SUM,COUNT,MAX,MIN,而 col 函数用于获取列名。要计算出 price 和 quantity 的乘积,可以使用数据库的数学函数 ABS。因此,在 Sequelize 中,我们可以这样实现:
[sequelize.fn('SUM', sequelize.fn('ABS', sequelize.fn('product.price * order.quantity'))), 'total_sales']
然后,对于 GROUP BY 子句,我们只需在 findAll 的选项中添加 group 参数即可:
group: ['name']
完整示例
为了完整演示这个示例,我们需要创建一个表 order,并插入一些样例数据:
const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('mysql://user:password@localhost:3306/database');
class Order extends Model {}
Order.init({
name: DataTypes.STRING,
price: DataTypes.FLOAT,
quantity: DataTypes.INTEGER
}, { sequelize, modelName: 'order' });
(async () => {
await sequelize.sync({ force: true });
await Order.bulkCreate([
{ name: 'apple', price: 0.99, quantity: 10 },
{ name: 'orange', price: 1.5, quantity: 5 },
{ name: 'banana', price: 0.5, quantity: 20 }
]);
})();
然后,我们可以使用以下代码实现上述聚合查询:
const { Order } = require('./models');
(async () => {
const result = await Order.findAll({
attributes: [
'name',
[sequelize.fn('SUM', sequelize.fn('ABS', sequelize.fn('order.price * order.quantity'))), 'total_sales']
],
group: ['name']
});
console.log(result);
})();
最后,运行该脚本,我们将会得到以下输出:
[
{ name: 'apple', total_sales: 9.9 },
{ name: 'banana', total_sales: 10 },
{ name: 'orange', total_sales: 7.5 }
]
总结
在 Sequelize 中实现 MySQL 的 SUM 函数和 GROUP BY 子句非常简单。只需使用 fn 函数和 col 函数即可。记住,使用组合式函数时,要小心处理操作顺序。如果您想对 Sequelize 有更深入的了解,请务必阅读官方文档。
极客教程