您好,登錄后才能下訂單哦!
前言
今天同事在同步完訂單數據后,由于訂單總金額和數據源的總金額存在差異,選擇使用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的執行書序來分析問題:
補充內容
這里補充一下SELECT語句執行順序
解決辦法
遇到需要統計分頁數據時(除了SUM()函數外,常見的COUNT()、AVG()、MAX()、MIN()函數也存在這個問題),可以選擇使用子查詢來處理(PS:這里不考慮內存計算,針對的是使用數據庫解決這個問題)。上面的問題解決方案如下:
SELECT SUM(o.amount) FROM (SELECT `amount` FROM `order` ORDER BY `id` LIMIT 5) AS o;
運行的返回值為500.00。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。