一、SQL与Sequelize中的分组查询

1.1 SQL中的分组查询

SQL查询中,通GROUP BY语名实现分组查询。GROUP BY子句要和聚合函数配合使用才能完成分组查询,在SELECT查询的字段中,如果没有使用聚合函数就必须出现在ORDER BY子句中。分组查询后,查询结果为一个或多个列分组后的结果集。

GROUP BY语法SELECT 列名, 聚合函数(列名)

FROM 表名

WHERE 列名 operator value

GROUP BY 列名

[HAVING 条件表达式] [WITH ROLLUP]

在以上语句中:

聚合函数 - 分组查询通常要与聚合函数一起使用,聚合函数包括:

COUNT()-用于统计记录条数

SUM()-用于计算字段的值的总和

AVG()-用于计算字段的值的平均值

MAX-用于查找查询字段的最大值

MIX-用于查找查询字段的最小值

GROUP BY子名-用于指定分组的字段

HAVING子名-用于过滤分组结果,符合条件表达式的结果将会被显示

WITH ROLLUP子名-用于指定追加一条记录,用于汇总前面的数据

1.2 Sequelize中的分组查询

使用聚合函数

Sequelize提供了聚合函数,可以直接对模型进行聚合查询:

aggregate(field, aggregateFunction, [options])-通过指定的聚合函数进行查询

sum(field, [options])-求和

count(field, [options])-统计查询结果数

max(field, [options])-查询最大值

min(field, [options])-查询最小值

以上这些聚合函数中,可以通过options.attributes、options.attributes属性指定分组相关字段,并可以通过options.having指定过滤条件,但没有直接指定WITH ROLLUP子句的参数。

如,使用.sum()查询订单数量大于1的用户订单额:Order.sum('price', {attributes:['name'], group:'name', plain:false, having:['COUNT(?)>?', 'name', 1]}).then(function(result){

console.log(result);

})

生成的SQL语句如下:SELECT `name`, sum(`price`) AS `sum` FROM `orders` AS `Orders` GROUP BY name HAVING COUNT('name')>1;

使用聚合参数

除直接使用聚合函数外,也可以在findAll()等方法中,指定聚合查询相关参数实现聚合查询。查询时,同样可以通过通过options.attributes、options.attributes属性指定分组相关字段,并可以通过options.having指定过滤条件。与直接使用聚合函数查询不一样,通过参数构建聚合查询时,要以数组或对象形式设置options.attributes参数中的聚合字段,并需要通过sequelize.fn()方法传入聚合函数。

如,使用.findAll()查询订单数量大于1的用户订单额:Order.findAll({attributes:['name', [sequelize.fn('SUM', sequelize.col('price')), 'sum']], group:'name', having:['COUNT(?)>?', 'name', 1], raw:true}).then(function(result){

console.log(result);

})

生成的SQL语句如下:SELECT `name`, sum(`price`) AS `sum` FROM `orders` AS `Orders` GROUP BY name HAVING COUNT('name')>1;

二、使用示例

现在订单表,数据如下:> select * from orders;

+---------+-------------+--------+-----------+---------------------+

| orderId | orderNumber | price | name | createdOn |

+---------+-------------+--------+-----------+---------------------+

| 1 | 00001 | 128.00 | 张小三 | 2016-11-25 10:12:49 |

| 2 | 00002 | 102.00 | 张小三 | 2016-11-25 10:12:49 |

| 4 | 00004 | 99.00 | 王小五 | 2016-11-25 10:12:49 |

| 3 | 00003 | 199.00 | 赵小六 | 2016-11-25 10:12:49 |

+---------+-------------+--------+-----------+---------------------+

2.1 简单使用

使用分组查询,统计每个客户的订单总额。

使用SQL语句,可以像下面这样查询:> select name, SUM(price) from orders GROUP BY name;

+-----------+------------+

| name | SUM(price) |

+-----------+------------+

| 张小三 | 230.00 |

| 王小五 | 99.00 |

| 赵小六 | 199.00 |

+-----------+------------+

而在Sequelize中可以像下面这样实现:Order.findAll({attributes:['sum', [sequelize.fn('SUM', sequelize.col('name')), 'sum']], group:'name', raw:true}).then(function(result){

console.log(result);

})

2.2 使用HAVING子句

统计订单数量大于1的用户的订单总金额。

使用SQL语句,可以像下面这样实现:> select name, SUM(price) from orders GROUP BY name HAVING count(1)>1;

+-----------+------------+

| name | SUM(price) |

+-----------+------------+

| 张小三 | 230.00 |

| 赵小六 | 199.00 |

+-----------+------------+

而使用Sequelize可以像下面这样查询:Order.findAll({attributes:['sum', [sequelize.fn('SUM', sequelize.col('name')), 'sum']], group:'name', having:['COUNT(?)>?', 'name', 1], raw:true}).then(function(result){

console.log(result);

})

2.3 使用WITH ROLLUP子句

WITH ROLLUP子句是MySQL 5.5+新增的特性,用于汇总统计结果。但本文发布时,Sequelize还不支持该特性。

增加总和统计列:> select name, SUM(price) from orders GROUP BY name WITH ROLLUP;

+-----------+------------+

| name | SUM(price) |

+-----------+------------+

| 张小三 | 230.00 |

| 王小五 | 99.00 |

| 赵小六 | 199.00 |

| NULL | 528.00 |

+-----------+------------+

2.4 连接查询与分组

为了管理方便,我们会将不同的信息保存在不同的表中。如,我们会将订单信息放在一张表中,而将客户信息保存在另一张表中。对于存在关联关系的两张表,我们会使用连接查询来查找关联数据,在进行连接查询时,同样可以以使用聚合函数。

订单表如下:> select * from orders;

+---------+-------------+--------+------------+---------------------+

| orderId | orderNumber | price | customerId | createdOn |

+---------+-------------+--------+------------+---------------------+

| 1 | 00001 | 128.00 | 1 | 2016-11-25 10:12:49 |

| 2 | 00002 | 102.00 | 1 | 2016-11-25 10:12:49 |

| 3 | 00003 | 199.00 | 4 | 2016-11-25 10:12:49 |

| 4 | 00004 | 99.00 | 3 | 2016-11-25 10:12:49 |

+---------+-------------+--------+------------+---------------------+

客户表结构如下:> select * from customers;

+----+-----------+-----+---------------------+---------------------+

| id | name | sex | birthday | createdOn |

+----+-----------+-----+---------------------+---------------------+

| 1 | 张小三 | 1 | 1986-01-22 08:00:00 | 2016-11-25 10:16:35 |

| 2 | 李小四 | 2 | 1987-11-12 08:00:00 | 2016-11-25 10:16:35 |

| 3 | 王小五 | 1 | 1988-03-08 08:00:00 | 2016-11-25 10:16:35 |

| 4 | 赵小六 | 1 | 1989-08-11 08:00:00 | 2016-11-25 10:16:35 |

+----+-----------+-----+---------------------+---------------------+

使用连接查询并分组查询,统计每个客户的订单总额。

使用SQL语句查询如下:> select c.name, SUM(o.price) AS sum from customers AS c INNER JOIN orders AS o ON o.customerId =c.id GROUP BY c.name;

Sequelize中进行连接查询时,首先需要建立模型间的关联关系:Order.belongsTo(Customer, {foreignKey: 'customerId'});

连接查询及分组:var include = [{

model: Customer,

required: true,

attributes: ['name'],

}]

Order.findAll({include:include, attributes:[[sequelize.fn('SUM', sequelize.col('price')), 'sum']], group:'Customer.name', having:['COUNT(?)>?', 'name', 1], raw:true, rollup:true}).then(function(result){

console.log(result);

})

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

更多Sequelize中用group by进行分组聚合查询相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php sequelize,Sequelize中用group by进行分组聚合查询相关推荐

  1. 分组聚合查询两门以上MySQL_MySQL中的分组聚合查询

    下面根据之前的表来做一下示例.这里只给出SQL命令. #查询学生总人数 SELECT COUNT(*) FROM tb_student; #查询选修了课程的学生总人数 SELECT COUNT(DIS ...

  2. MongoDB多条件分组聚合查询

    MongoDB多条件分组聚合查询 1.样例数据 {"_id" : ObjectId("5fa13fb76c3107345a82c047"),"_cla ...

  3. mysql分组查询和子查询语句_6.MySQL分组聚合查询,子查询

    自己的MySQL阅读笔记,持续更新,直到看书结束. 数据库技术可以有效帮助一个组织或者企业科学.有效的管理数据,也是现在很多企业招聘数据分析师的必备要求之一. 大家如果看过MySQL的书,也可以看我的 ...

  4. oracle分组聚合查询,Oracle中分组查询group by用法规则解析

    本篇文章小编给大家分享一下Oracle中分组查询group by用法规则解析,文章介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Oracle中group by ...

  5. Solr分组聚合查询之Group

    摘要: Solr对结果的分组处理除了facet还可以使用group.Solr的group是根据某一字段对结果分组,将每一组内满足查询的结果按顺序返回. Group对比Facet Group和Facet ...

  6. 聚合函数/分组聚合查询

    本博客前文链接,点击查看,便于理解代码的来龙去脉 聚合函数 MAX() MIN() COUNT() SUM() AVG() from stu.models import *def showsql(): ...

  7. 带你学MySQL系列 | 困扰MySQL初学者的分组聚合查询,我终于讲明白了!

    1.分组查询的原理图 对上述原始数据,按照DEPARTMENT_ID(员工id)分组统计SALARY(薪水)的平均值. 上述原理写成代码,应该怎么写呢? select department_id,av ...

  8. elasticsearch group by java_java elasticsearch聚合查询实例详解

    现有索引数据: index:school type:student --------------------------------------------------- {"grade&q ...

  9. mysql group by 聚合_浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    1. 聚合函数(Aggregate Function) MySQL(5.7 ) 官方文档中给出的聚合函数列表(图片)如下: 除非另有说明,否则聚合函数都会忽略空值(NULL values). 2. 聚 ...

最新文章

  1. action_mailer_basics
  2. WINDOWS XP 开始→运行→命令 集锦
  3. TestNG 自动化测试入门教程--典型示例
  4. Codeforces 1109F. Sasha and Algorithm of Silence's Sounds
  5. 开源游戏服务器端框架Firefly正式将GFirefly整合
  6. 网页表格线框html,关于Dreamweaver中怎么让html网页中的table边框细线显示?
  7. linux查看文件大小和查看磁盘使用情况
  8. C#深入浅出 关键字(一)
  9. 新版知识付费系统付费阅读小程序源码知识付费平台
  10. loadrunner-2-9添加事务
  11. 十大经典排序算法(附代码、动画及改进方案)
  12. MYSQL 慢查询日志分析
  13. 关于JQuery全选/反选第二次失效的问题
  14. python中sys.argv[]的使用
  15. python2与python3区别底层的区别_Python2 与 Python3 的区别(二)?
  16. Word 制作三线表
  17. 2B: 怎么把黑科技卖给顶级金融机构? | 甲子光年
  18. 580刷590bios_RX580 2048sp刷vbios降为RX570 用上黑苹果美滋滋
  19. PS亮度蒙版插件TKActions V5 Mac版
  20. 说一说Qpython在Android手机上的应用(二)

热门文章

  1. 基本比例尺地形图分带方法
  2. MBR每个分区不超过2T
  3. 技术分享 | 半监督学习介绍
  4. 开源 C++ JSON 库 sonic-cpp解析性能为 rapidjson 的 2.5 倍
  5. k8s——kubernetes使用rook部署ceph集群
  6. 【网络流-最小割】USA4.4——追查坏牛奶Pollutant Control
  7. 流量复制工具gor使用简介
  8. 【车间调度】灰狼优化算法求解柔性作业车间问题【含Matlab源码 661期】
  9. 可调数控升降压电源模块 带显示保护12v升压太阳能充电恒压恒流
  10. eclipse如何导入javax.servlet.*