最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Sequelize中用group by進行分組聚合查詢

 更新時間:2016年12月12日 08:34:16   投稿:daisy  
大家都知道在SQL查詢中,分組查詢是較常用的一種查詢方式。分組查詢是指通過GROUP BY關鍵字,將查詢結果按照一個或多個字段進行分組,分組時字段值相同的會被分為一組。在Node.js基于Sequelize的ORM框架中,同樣支持分組查詢,使用非常簡單方便。下面來看看詳細的介紹。

一、SQL與Sequelize中的分組查詢

1.1 SQL中的分組查詢

SQL查詢中,通GROUP BY語名實現(xiàn)分組查詢。GROUP BY子句要和聚合函數(shù)配合使用才能完成分組查詢,在SELECT查詢的字段中,如果沒有使用聚合函數(shù)就必須出現(xiàn)在ORDER BY子句中。分組查詢后,查詢結果為一個或多個列分組后的結果集。

GROUP BY語法

SELECT 列名, 聚合函數(shù)(列名)
FROM 表名
WHERE 列名 operator value
GROUP BY 列名 
[HAVING 條件表達式] [WITH ROLLUP]

在以上語句中:

聚合函數(shù) - 分組查詢通常要與聚合函數(shù)一起使用,聚合函數(shù)包括:

  •      COUNT()-用于統(tǒng)計記錄條數(shù)
  •      SUM()-用于計算字段的值的總和
  •      AVG()-用于計算字段的值的平均值
  •      MAX-用于查找查詢字段的最大值
  •      MIX-用于查找查詢字段的最小值

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

HAVING子名-用于過濾分組結果,符合條件表達式的結果將會被顯示

WITH ROLLUP子名-用于指定追加一條記錄,用于匯總前面的數(shù)據(jù)

1.2 Sequelize中的分組查詢

使用聚合函數(shù)

Sequelize提供了聚合函數(shù),可以直接對模型進行聚合查詢:

  1. aggregate(field, aggregateFunction, [options])-通過指定的聚合函數(shù)進行查詢
  2. sum(field, [options])-求和
  3. count(field, [options])-統(tǒng)計查詢結果數(shù)
  4. max(field, [options])-查詢最大值
  5. min(field, [options])-查詢最小值

以上這些聚合函數(shù)中,可以通過options.attributes、options.attributes屬性指定分組相關字段,并可以通過options.having指定過濾條件,但沒有直接指定WITH ROLLUP子句的參數(shù)。

如,使用.sum()查詢訂單數(shù)量大于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;

使用聚合參數(shù)

除直接使用聚合函數(shù)外,也可以在findAll()等方法中,指定聚合查詢相關參數(shù)實現(xiàn)聚合查詢。查詢時,同樣可以通過通過options.attributes、options.attributes屬性指定分組相關字段,并可以通過options.having指定過濾條件。與直接使用聚合函數(shù)查詢不一樣,通過參數(shù)構建聚合查詢時,要以數(shù)組或?qū)ο笮问皆O置options.attributes參數(shù)中的聚合字段,并需要通過sequelize.fn()方法傳入聚合函數(shù)。

如,使用.findAll()查詢訂單數(shù)量大于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;

二、使用示例

現(xiàn)在訂單表,數(shù)據(jù)如下:

> 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 簡單使用

使用分組查詢,統(tǒng)計每個客戶的訂單總額。

使用SQL語句,可以像下面這樣查詢:

> select name, SUM(price) from orders GROUP BY name;
+-----------+------------+
| name  | SUM(price) |
+-----------+------------+
| 張小三 |  230.00 |
| 王小五 |  99.00 |
| 趙小六 |  199.00 |
+-----------+------------+

而在Sequelize中可以像下面這樣實現(xiàn):

Order.findAll({attributes:['sum', [sequelize.fn('SUM', sequelize.col('name')), 'sum']], group:'name', raw:true}).then(function(result){
 console.log(result);
})

2.2 使用HAVING子句

統(tǒng)計訂單數(shù)量大于1的用戶的訂單總金額。

使用SQL語句,可以像下面這樣實現(xiàn):

> 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+新增的特性,用于匯總統(tǒng)計結果。但本文發(fā)布時,Sequelize還不支持該特性。

增加總和統(tǒng)計列:

> 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 連接查詢與分組

為了管理方便,我們會將不同的信息保存在不同的表中。如,我們會將訂單信息放在一張表中,而將客戶信息保存在另一張表中。對于存在關聯(lián)關系的兩張表,我們會使用連接查詢來查找關聯(lián)數(shù)據(jù),在進行連接查詢時,同樣可以以使用聚合函數(shù)。

訂單表如下:

> 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 |
+----+-----------+-----+---------------------+---------------------+

使用連接查詢并分組查詢,統(tǒng)計每個客戶的訂單總額。

使用SQL語句查詢?nèi)缦拢?/p>

> 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中進行連接查詢時,首先需要建立模型間的關聯(lián)關系:

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);
})

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關文章

  • CentOS7中源碼編譯安裝NodeJS的完整步驟

    CentOS7中源碼編譯安裝NodeJS的完整步驟

    這篇文章主要給大家介紹了關于CentOS7中源碼編譯安裝NodeJS的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用nodejs具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-10-10
  • 如何利用node轉(zhuǎn)發(fā)請求詳解

    如何利用node轉(zhuǎn)發(fā)請求詳解

    這篇文章主要給大家介紹了關于利用node轉(zhuǎn)發(fā)請求的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Nodejs中session的簡單使用及通過session實現(xiàn)身份驗證的方法

    Nodejs中session的簡單使用及通過session實現(xiàn)身份驗證的方法

    session的本質(zhì)使用cookie來實現(xiàn)。本文給大家介紹Nodejs中session的簡單使用及通過session實現(xiàn)身份驗證的方法,對node.js session相關知識感興趣的朋友一起學習吧
    2016-02-02
  • 在Node.js中判定文件是否可執(zhí)行的方法詳解

    在Node.js中判定文件是否可執(zhí)行的方法詳解

    在進行前端開發(fā)時,經(jīng)常需要處理各種文件權限的問題,特別是在Node.js環(huán)境中,你可能想要判斷某個文件是否具有可執(zhí)行權限,本文將詳細介紹如何使用isexe模塊來進行這一操作,需要的朋友可以參考下
    2024-05-05
  • Node登錄權限驗證token驗證實現(xiàn)的方法示例

    Node登錄權限驗證token驗證實現(xiàn)的方法示例

    這篇文章主要介紹了Node登錄權限驗證token驗證實現(xiàn)的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • node連接mysql查詢事務處理的實現(xiàn)

    node連接mysql查詢事務處理的實現(xiàn)

    本文主要介紹了node連接mysql查詢事務處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Node.js安裝詳細步驟教程(Windows版)詳解

    Node.js安裝詳細步驟教程(Windows版)詳解

    這篇文章主要介紹了Node.js安裝詳細步驟教程(Windows版),本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 詳解Node.js中exports和module.exports的區(qū)別

    詳解Node.js中exports和module.exports的區(qū)別

    這篇文章主要介紹了詳解Node.js中exports和module.exports的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 從零開始學習Node.js系列教程之SQLite3和MongoDB用法分析

    從零開始學習Node.js系列教程之SQLite3和MongoDB用法分析

    這篇文章主要介紹了Node.js SQLite3和MongoDB用法,結合實例形式分析了SQLite3和MongoDB數(shù)據(jù)庫的初始化、連接、查詢等操作的實現(xiàn)技巧與相關注意事項,需要的朋友可以參考下
    2017-04-04
  • Windows中安裝nvm進行Node版本控制與詳細使用教程

    Windows中安裝nvm進行Node版本控制與詳細使用教程

    nvm和npm都是node.js版本管理工具,但是為了解決node各種不同之間版本存在不兼容的問題,因此可以通過nvm安裝和切換不同版本的node,感興趣的可以了解一下
    2023-09-09

最新評論

承德市| 琼海市| 定南县| 海口市| 洛隆县| 杨浦区| 贺兰县| 麻城市| 南靖县| 温州市| 新绛县| 都匀市| 徐州市| 耒阳市| 嘉兴市| 新野县| 中西区| 龙井市| 冕宁县| 天长市| 定结县| 永州市| 彰化市| 石城县| 绵竹市| 乌兰浩特市| 米易县| 奇台县| 鸡西市| 阳原县| 城市| 辉南县| 湘潭县| 图们市| 东山县| 望都县| 中宁县| 象山县| 托克逊县| 巴彦淖尔市| 祥云县|