91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-26 14:43:04 來源:腳本之家 閱讀:177 作者:Null 欄目:MySQL數據庫

前言

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

數據庫版本為mysql 5.7,下面會用一個示例復盤遇到的問題。

問題復盤

本次復盤會用一個很簡單的訂單表作為示例。

數據準備

訂單表建表語句如下(這里偷懶了,使用了自增ID,實際開發中不建議使用自增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如下(執行10次即可)

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

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

問題SQL

使用limit對數據進行分頁查詢,同時使用sum()函數計算出當前分頁的總金額

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

前面也提到了運行的結果,期待的結果應該為5*100=500,然而實際運行的結果卻為1000.00(帶有小數點是因為數據類型)

問題排查

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

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

補充內容

這里補充一下SELECT語句執行順序

  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>

解決辦法

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

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

運行的返回值為500.00。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平顺县| 大庆市| 沙湾县| 沐川县| 三河市| 古浪县| 洛隆县| 新蔡县| 盐城市| 嵩明县| 南召县| 加查县| 武义县| 香格里拉县| 石渠县| 黄山市| 澜沧| 滨州市| 海宁市| 广平县| 婺源县| 城固县| 达拉特旗| 龙门县| 惠州市| 苗栗市| 都江堰市| 双柏县| 绥中县| 准格尔旗| 图木舒克市| 广饶县| 长海县| 饶平县| 固阳县| 临沭县| 年辖:市辖区| 屯留县| 甘洛县| 临猗县| 宜丰县|