MySQL更新计算错误的划分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL更新计算错误的划分相关的知识,希望对你有一定的参考价值。
我有一个像这样的mysql表:
CREATE TABLE IF NOT EXISTS `entries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_name` varchar(255) NOT NULL,
`presentation_name` varchar(255) NOT NULL,
`total_score` mediumint(9) NOT NULL,
`times_played` mediumint(9) NOT NULL,
`avg_score` float(4,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=206 ;
我正在使用php更新数据 但更新时查询计算错误'avg_score'。可以说,整行看起来像这样:
id domain_name presentation_name total_score times_played avg_score
1 test.com test 30 3 10.00
但是,当我使用新数据运行此更新查询时:
$score = 6;
$query = "UPDATE `entries`
SET
total_score = (total_score + $score),
times_played = (times_played + 1),
avg_score = ( (total_score + $score) / (times_played + 1) )
WHERE id = '1'";
它变成这样:
id domain_name presentation_name total_score times_played avg_score
1 test.com test 36 4 8.40
你可以看到'avg_score'是错误的(应该是9.00)。我在phpmyadmin中尝试了相同的查询并得到了相同的错误计算。真的找不到我在这里做错了什么。
来自MySQL manual:
以下语句中的第二个赋值将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1和col2具有相同的值。此行为与标准SQL不同。
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
所以你可以在更新平均值时省略+分数和+ 1:
UPDATE `entries` SET
total_score = total_score + $score,
times_played = times_played + 1,
avg_score = total_score / times_played
WHERE id = '1'
看到
total_score = (total_score + $score),
36 = 30 + 6
times_played = (times_played + 1),
4 = 3 + 1
然后你做
avg_score = ( (total_score + $score) / (times_played + 1) )
8.4 = (36 + 6) / 5
是正确的!
看起来您的前两列已更新,更新第三列时使用更新的值,请注意8.4 = (36 + 6) / (4 + 1)
因此,您不需要+1
和+ $score
作为第三列。
虽然您确实不应该在数据库中存储重复数据,因为这只会导致这样的问题。
只需在php或mysql中计算你需要的平均值。
尝试:改变顺序(首选方法)
SET
avg_score = ( (total_score + $score) / (times_played + 1) ) ,
total_score = (total_score + $score),
times_played = (times_played + 1)
要么:
SET
total_score = (total_score + $score),
times_played = (times_played + 1),
avg_score = ( (total_score) / (times_played) )
您正在引用已在后续计算中调整的字段,但假设它们保持不变。
看起来更新正在逐步完成。
也就是说,总得分为36,次数达到4,然后avg_score的计算完成(36 + 6,4 + 1)= 42/5 = 8.4
尝试用另一个句子更新avg_score。
不知道这是做什么的。
更改:
$score = 6;
$query = "UPDATE `entries`
SET
total_score = (total_score + $score),
times_played = (times_played + 1),
avg_score = ( (total_score + $score) / (times_played + 1) )
WHERE id = '1'";
至:
$score = 6;
$query = "UPDATE `entries`
SET
total_score = (total_score + $score),
times_played = (times_played + 1),
avg_score = (total_score /times_played )
WHERE id = '1'";
以上是关于MySQL更新计算错误的划分的主要内容,如果未能解决你的问题,请参考以下文章
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试