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')

參考地址: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 ,直接加和),實際解決辦法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章