为什么五个1 = 4的总和

时间:2012-07-20 10:15:29

标签: 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的答案 但是感到非常困惑

2 个答案:

答案 0 :(得分:4)

这就是原因(正如Twitter所讨论的那样):

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

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

答案 1 :(得分:2)

这可能是旧版MySQL中的一些错误。

我在MySQL 5.5上尝试过它,并且它的工作非常好。