mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题
問題復盤
本次復盤會用一個很簡單的訂單表作為示例。
數據準備
訂單表建表語句如下(這里偷懶了,使用了自增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;
1
2
3
4
5
插入金額為100的SQL如下(執行10次即可)
INSERT INTO `order`(`amount`) VALUES (100);
1
所以總金額為10*100=1000。
問題SQL
使用limit對數據進行分頁查詢,同時使用sum()函數計算出當前分頁的總金額
SELECT
SUM(`amount`)
FROM
`order`
ORDER BY `id`
LIMIT 5;
1
2
3
4
5
6
前面也提到了運行的結果,期待的結果應該為5*100=500,然而實際運行的結果卻為1000.00(帶有小數點是因為數據類型)
問題排查
其實如果對SELECT語句執行順序有一定了解的朋友可以很快確定為什么返回的結果為所有的訂單總金額?下面我會就問題SQL的執行書序來分析問題:
FROM:FROM子句是最先執行的,確定了查詢的是order這張表
SELECT:SELECT子句是第二個執行的子句,同時SUM()函數也在此時執行了。
ORDER BY:ORDER BY子句是第三個執行的子句,其處理的結果只有一個,就是訂單總金額
LIMIT:LIMIT子句是最后執行的,此時結果集中只有一個結果(訂單總金額)
補充內容
這里補充一下SELECT語句執行順序
FROM
ON
JOIN
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
ORDER BY
LIMIT
解決辦法
遇到需要統計分頁數據時(除了SUM()函數外,常見的COUNT()、AVG()、MAX()、MIN()函數也存在這個問題),可以選擇使用子查詢來處理(PS:這里不考慮內存計算,針對的是使用數據庫解決這個問題)。上面的問題解決方案如下:
SELECT
SUM(o.amount)
FROM
(SELECT
`amount`
FROM
`order`
ORDER BY `id`
LIMIT 5) AS o;
1
2
3
4
5
6
7
8
9
運行的返回值為500.00。
---------------------
mysql踩坑記錄之limit和sum函數混合使用問題
標簽:ODB???order???min???針對???charset???group???計算???mys???分頁查詢
本條技術文章來源于互聯網,如果無意侵犯您的權益請點擊此處反饋版權投訴
本文系統來源:https://www.cnblogs.com/hyhy904/p/11072377.html
總結
以上是生活随笔為你收集整理的mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三届蓝桥杯决赛真题---数量周期
- 下一篇: Linux进阶之路———— RPM 与