Node.js 使用sequlize 操作mysql数据库时,查询一条记录中两个字段的加和

原始查询

https://itbilu.com/nodejs/npm/VJIR1CjMb.html#model-pagination

一、需求描述

本项目的需求主要是涉及到很多的数据指标,及指标的相关计算

二、问题分析

在网上查询了很多资料,包括sequlize的手册,相关问题博客等,基本没有遇到论述这个问题的,搜集到的最多的结果是使用sum函数,求查询出来的所有记录某一属性的总和,甚至还需要使用到group by 进行分类。但是实际需求并不是这样的,而是求查询出来的一条记录中的某几个属性和。

三、心路历程

大多数查到的都是这样的,调用在sequlize.fn中调用sum方法,但实际是这并不符合我的需求

遇到几个新的函数

sequelize.col('age')

sequelize.fn()

sequelize.literal('age')

扫描二维码关注公众号,回复: 5353184 查看本文章

参考地址:Sequelize 中文API文档-1. 快速入门、Sequelize类

https://itbilu.com/nodejs/npm/VkYIaRPz-.html#api-instance-models 

四、解决办法

参考地址:Sequelize 字段自增、自减及批量自增、自减更新

https://itbilu.com/nodejs/npm/N1pPjUdMf.html 

五、总结

为了解决这个问题,查了将近两天的资料,各种尝试,有大部分的时间都在尝试使用sequlize.fn("sum",*)的方法来解决这个问题,在使用的时候心里还是有疑问的,就算是实现了这个,最后结果也不是我想要的结果,等我跑通了,发现真的不是我要的结果,最后注意到sequlize.literal(*),这个函数,开始尝试,最后将问题解决。

六、意外收获

1、sequlize 语法支持剔除属性查询

具体描述:

当前数据表共有100个指标字段,但是只需要查询其中的95个数据指标,显然不适合将95个待查询指标的字段名称都写在select关键字的后面,当然你可以使用 “select * 将100个数据指标全部都查出来,然后在结果集中过滤,但如果我们能够在执行sql语句的时候直接将不想要的数据指标剔除掉,直接获得我们想要的结果集,便是再好不过了。

全部查询时,可以通过exclude子属性来排除不需要查询的字段。

此时可使用sequlize的语句为:

Model.findAll({
  attributes: { exclude: ['baz'] }
});

对应的sql语句为:

SELECT id, foo, bar, quz ...

2、sequlize语法支持在全部数据指标上,查询其他的聚合查询,而不需要将全部的数据指标都罗列一遍

具体描述:

当前数据表共有100个指标字段,需要查询103个数据指标,其中有3个数据指标是100个原始数据指标中聚合的数据,比如第101个待查询的数据指标的取值为 A指标与B指标的和,第102个待查询的数据指标的取值为 C指标与B指标的和,第103个待查询的数据指标的取值为 A指标与B指标的差。这时我们并不需要将这个103个数据都在select关键字后面都罗列出来,只需要将多余的这三个写出来即可。

当需要查询所有字段并对某一字段使用聚合查询时,而只需要以对象的形式传入attributes并添加include子属性即可。

此时可使用sequlize的语句为:

// 指定全查询字段比较麻烦
Model.findAll({
  attributes: ['id', 'foo', 'bar', 'baz', 'quz', [sequelize.fn('COUNT', sequelize.col('hats')), 'no_hats']]
});

// 这样会比较简短,且在你添加/删除属性后不会出错
Model.findAll({
  attributes: { include: [[sequelize.fn('COUNT', sequelize.col('hats')), 'no_hats']] }
});

对应的sql语句为:

SELECT id, foo, bar, baz, quz, COUNT(hats) AS no_hats ...

3、聚合数据查询

通过sequelize.fn方法可以进行聚合查询:

Model.findAll({
  attributes: [[sequelize.fn('COUNT', sequelize.col('hats')), 'no_hats']]
});

对应的sql语句为:

SELECT COUNT(hats) AS no_hats ...

在使用聚合函数时,要给聚合字段指定一个别名。如,在上例中我们为聚合函数指定了别名'no_hats',这样我们就能在查询的回调函数实例中通过instance.get('no_hats')来访问聚合统计的结果。

待添加:实际数据库截图(使用sum,不使用sum,groupby ,直接加和),实际解决办法

猜你喜欢

转载自blog.csdn.net/qq_25537177/article/details/84973781