一、需求描述
本项目的需求主要是涉及到很多的数据指标,及指标的相关计算
二、问题分析
在网上查询了很多资料,包括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 ,直接加和),实际解决办法
原始查询https://itbilu.com/nodejs/npm/VJIR1CjMb.html#model-pagination一、需求描述本项目的需求主要是涉及到很多的数据指标,及指标的相关计算二、问题分析在网上查询了很多资料,包括sequlize的手册,相关问题博客等,基本没有遇到论述这个问题的,搜集到的最多的结果是使用sum函数,求查询出来的所有记录某一属性的总和,甚至...
众所周知,Node的出现赋予了前端开发人员更大的权利,更强的能力。Sequelize就是这个强大能力中的一部分,它是一个ORM,可以将数据库中的表单数据映射成js对象,让我们可以通过javascript来方便快捷的操作数据库。
想要使用数据库,首先需要连接到这个数据库。
Sequelize将在初始化时设置连接池,所以如果从单个进程连接到数据库,你最好每个数据库只创建一个实例。 如果要从...
Node.js 使用sequlize 操作mysql数据库时,查询一条记录中两个字段的加和
一.使用Sequelize连接数据库
Sequelize - 使用 model 查询数据
Sequelize手记 - (一)(连接时的配置项更多)
const mysqlConfig ={
host: 'localhost', // 接数据库的主机
port: '3306', ...
twoziduan001 twoziduan001
看一下上面的两张表有什么相同与不同的地方:
前2记录完全相同,第3 条和第4条只有sfzhm相同,第五条记
findOrCreate()
findAndCountAll()
findAndCountAll 方法是结合了 findAll 和 count 的便捷方法. 在处理与分页有关的查询时非常有用,在分页中,你想检索带有 limit 和 offset 的数据,但又需要知道与查询匹配的记录总数.
findAndCountAll 方法返回一个具有两个属性的对象:
(1)count - 一个整数 - 符合查询条件的记录总数
(2)rows - 一
// 查询多个表的 SQL 语句
const sql = 'SELECT * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.t1_id';
// 使用连接池查询
pool.query(sql, function(err, results, fields) {
if (err) {
// 处理错误
// 处理查询结果