濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > mysql踩坑之limit與sum函數(shù)混合使用問題詳解

mysql踩坑之limit與sum函數(shù)混合使用問題詳解

熱門標(biāo)簽:昌德訊外呼系統(tǒng) 電話機(jī)器人的價(jià)格多少錢一個(gè)月 中國地圖標(biāo)注公司 400電話申請(qǐng)廠家現(xiàn)貨 福建外呼電銷機(jī)器人加盟 百度地圖標(biāo)注要什么軟件 自己做地圖標(biāo)注需要些什么 天津公司外呼系統(tǒng)軟件 徐涇鎮(zhèn)騰訊地圖標(biāo)注

前言

今天同事在同步完訂單數(shù)據(jù)后,由于訂單總金額和數(shù)據(jù)源的總金額存在差異,選擇使用LIMIT和SUM()函數(shù)計(jì)算當(dāng)前分頁的總金額來和對(duì)方比較特定訂單的總金額,卻發(fā)現(xiàn)計(jì)算出來的金額并不是分頁的訂單總金額,而是所有訂單的總金額。

數(shù)據(jù)庫版本為mysql 5.7,下面會(huì)用一個(gè)示例復(fù)盤遇到的問題。

問題復(fù)盤

本次復(fù)盤會(huì)用一個(gè)很簡(jiǎn)單的訂單表作為示例。

數(shù)據(jù)準(zhǔn)備

訂單表建表語句如下(這里偷懶了,使用了自增ID,實(shí)際開發(fā)中不建議使用自增ID作為訂單ID)

CREATE TABLE `order` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '訂單ID',
 `amount` decimal(10,2) NOT NULL COMMENT '訂單金額',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入金額為100的SQL如下(執(zhí)行10次即可)

INSERT INTO `order`(`amount`) VALUES (100);

所以總金額為10*100=1000。

問題SQL

使用limit對(duì)數(shù)據(jù)進(jìn)行分頁查詢,同時(shí)使用sum()函數(shù)計(jì)算出當(dāng)前分頁的總金額

SELECT 
  SUM(`amount`)
FROM
  `order`
ORDER BY `id`
LIMIT 5;

前面也提到了運(yùn)行的結(jié)果,期待的結(jié)果應(yīng)該為5*100=500,然而實(shí)際運(yùn)行的結(jié)果卻為1000.00(帶有小數(shù)點(diǎn)是因?yàn)閿?shù)據(jù)類型)

問題排查

其實(shí)如果對(duì)SELECT語句執(zhí)行順序有一定了解的朋友可以很快確定為什么返回的結(jié)果為所有的訂單總金額?下面我會(huì)就問題SQL的執(zhí)行書序來分析問題:

  1. FROM:FROM子句是最先執(zhí)行的,確定了查詢的是order這張表
  2. SELECT:SELECT子句是第二個(gè)執(zhí)行的子句,同時(shí)SUM()函數(shù)也在此時(shí)執(zhí)行了。
  3. ORDER BY:ORDER BY子句是第三個(gè)執(zhí)行的子句,其處理的結(jié)果只有一個(gè),就是訂單總金額
  4. LIMIT:LIMIT子句是最后執(zhí)行的,此時(shí)結(jié)果集中只有一個(gè)結(jié)果(訂單總金額)

補(bǔ)充內(nèi)容

這里補(bǔ)充一下SELECT語句執(zhí)行順序

  1. FROM left_table>
  2. ON join_condition>
  3. join_type> JOIN right_table>
  4. WHERE where_condition>
  5. GROUP BY group_by_list>
  6. HAVING having_condition>
  7. SELECT
  8. DISTINCT select_list>
  9. ORDER BY order_by_condition>
  10. LIMIT limit_number>

解決辦法

遇到需要統(tǒng)計(jì)分頁數(shù)據(jù)時(shí)(除了SUM()函數(shù)外,常見的COUNT()、AVG()、MAX()、MIN()函數(shù)也存在這個(gè)問題),可以選擇使用子查詢來處理(PS:這里不考慮內(nèi)存計(jì)算,針對(duì)的是使用數(shù)據(jù)庫解決這個(gè)問題)。上面的問題解決方案如下:

SELECT 
  SUM(o.amount)
FROM
  (SELECT 
    `amount`
  FROM
    `order`
  ORDER BY `id`
  LIMIT 5) AS o;

運(yùn)行的返回值為500.00。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • MySQL查詢優(yōu)化:LIMIT 1避免全表掃描提高查詢效率
  • 為什么MySQL分頁用limit會(huì)越來越慢
  • mysql優(yōu)化之query_cache_limit參數(shù)說明
  • 詳解Mysql order by與limit混用陷阱
  • mysql分頁的limit參數(shù)簡(jiǎn)單示例
  • MySQL limit分頁大偏移量慢的原因及優(yōu)化方案
  • Mysql排序和分頁(order by&limit)及存在的坑
  • MySQL limit使用方法以及超大分頁問題解決
  • 如何提高M(jìn)ySQL Limit查詢性能的方法詳解
  • MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解
  • 淺談mysql使用limit分頁優(yōu)化方案的實(shí)現(xiàn)
  • MySQL中l(wèi)imit對(duì)查詢語句性能的影響

標(biāo)簽:梅河口 北京 陜西 駐馬店 黔西 荊門 鄂爾多斯 昌都

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql踩坑之limit與sum函數(shù)混合使用問題詳解》,本文關(guān)鍵詞  mysql,踩坑,之,limit,與,sum,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql踩坑之limit與sum函數(shù)混合使用問題詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于mysql踩坑之limit與sum函數(shù)混合使用問題詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    常德市| 金沙县| 紫金县| 花莲县| 鄂温| 湾仔区| 鹿泉市| 玛沁县| 高要市| 宁海县| 临海市| 久治县| 麻城市| 拉萨市| 绍兴县| 黄梅县| 通海县| 同仁县| 石林| 新干县| 安仁县| 汉川市| 津市市| 邹平县| 峡江县| 锡林浩特市| 云阳县| 卓尼县| 若尔盖县| 洪湖市| 仪征市| 吕梁市| 延长县| 宁海县| 新龙县| 霍林郭勒市| 高淳县| 渝中区| 汉沽区| 樟树市| 西宁市|