1

基本查询按预期工作,但是当我尝试对第一列求和时,它假定为 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 作为使用 MySQL 计算时间线变化的答案, 但很困惑

4

2 回答 2

4

原因如下(如Twitter 上所讨论的):

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

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

于 2012-07-22T19:00:16.283 回答
2

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

我已经在 MySQL 5.5 上尝试过它并且它工作得很好。

于 2012-07-20T10:28:40.587 回答