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'";

SQL Fiddle

以上是关于MySQL更新计算错误的划分的主要内容,如果未能解决你的问题,请参考以下文章

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?

线程学习知识点总结

从mysql的片段中加载ListView

Java 求解划分字母区间

MySQL 错误代码:在 MySQL Workbench 中更新期间出现 1175