原始查询
https://itbilu.com/nodejs/npm/VJIR1CjMb.html#model-pagination
一、需求描述
本项目的需求主要是涉及到很多的数据指标,及指标的相关计算
二、问题分析
在网上查询了很多资料,包括sequlize的手册,相关问题博客等,基本没有遇到论述这个问题的,搜集到的最多的结果是使用sum函数,求查询出来的所有记录某一属性的总和,甚至还需要使用到group by 进行分类。但是实际需求并不是这样的,而是求查询出来的一条记录中的某几个属性和。
三、心路历程
大多数查到的都是这样的,调用在sequlize.fn中调用sum方法,但实际是这并不符合我的需求
遇到几个新的函数
sequelize.col('age')
sequelize.fn()
sequelize.literal('age')
参考地址: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 ,直接加和),实际解决办法