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