mysql - 为什么五和1 = 4

标签 mysql sql

基本查询按预期工作,但当我尝试对第一列求和时,它应该是 5,但我得到的是 4,为什么?

基础查询:

SET @last_task = 0;
SELECT 
  IF(@last_task = RobotShortestPath, 0, 1) AS new_task,
  @last_task := RobotShortestPath
FROM rob_log
ORDER BY rog_log_id;

1   1456
0   1456
0   1456
1   1234
0   1234
1   1456
1   2556
1   1456

求和查询

SET @last_task = 0;
SELECT SUM(new_task) AS tasks_performed
FROM (
  SELECT 
    IF(@last_task = RobotShortestPath, 0, 1) AS new_task,
    @last_task := RobotShortestPath
  FROM rob_log
  ORDER BY rog_log_id
) AS tmp

4

表结构

CREATE TABLE rob_log (
  rog_log_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
#  RobotPosX FLOAT NOT NULL,
#  RobotPosY FLOAT NOT NULL,
#  RobotPosDir TINYINT UNSIGNED NOT NULL,
  RobotShortestPath MEDIUMINT UNSIGNED NOT NULL,
  PRIMARY KEY(rog_log_id),
  KEY (rog_log_id, RobotShortestPath)
);

INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 1234;
INSERT INTO rob_log(RobotShortestPath) SELECT 1234;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;
INSERT INTO rob_log(RobotShortestPath) SELECT 2556;
INSERT INTO rob_log(RobotShortestPath) SELECT 1456;

在 sqlfiddle 上测试它:http://sqlfiddle.com/#!2/e80f5/3 作为 Counting changes in timeline with MySQL 的答案 但我真的很困惑

最佳答案

原因如下(如 Twitter 中所讨论):

变量@last_task 是在单独的查询“batch”中定义的。我将 SQL Fiddle 上的查询分解为单独的批处理,分别执行。我这样做是为了让您可以在下面看到每个批处理的输出作为不同的结果集。在您的 Fiddle 中,您可以看到有两组输出:http://sqlfiddle.com/#!2/e80f5/3/0http://sqlfiddle.com/#!2/e80f5/3/1 .这些映射到您正在运行的两个语句(set 和 select)。问题是,您的 set 语句定义了一个仅存在于第一批中的变量;当 select 语句运行时,它是一个单独的批处理,并且您的变量未在该上下文中定义。

要纠正这个问题,您所要做的就是定义一个不同的查询终止符。请注意架构和查询面板下的下拉框/按钮 ( [ ; ] ) - 单击它,您可以选择分号(默认)以外的其他内容。然后你的两个语句将作为同一批的一部分包含在一起,你会得到你想要的结果。例如: http://sqlfiddle.com/#!2/e80f5/9

关于mysql - 为什么五和1 = 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11577333/

相关文章:

PHP 异步函数调用与 AJAX

MySQL 8 - 删除特定数据库中的所有存储过程

sql - 按计数过滤的查询

SQL如何仅连接第一个匹配行

mysql - 连接两个表并计算每个学生的分数总和

mysql - 如何将 MySQL Views 与 Ms Access 2007 一起使用,而不会对字符串列造成垃圾?

mysql - UNION ALL 之后的 GROUP BY 不会对结果进行分组

mysql - 有没有办法在 mysql 中生成随机数并附加到字符串上?

mysql - SQL:链接两个表

mysql - 使用变量更新触发器中的 SQL 语法错误