Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么五的和是1=4_Mysql_Sql - Fatal编程技术网

Mysql 为什么五的和是1=4

Mysql 为什么五的和是1=4,mysql,sql,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 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上测试它: 回答
但我还是有些困惑

这可能是MySQL旧版本中的一个bug


我在MySQL 5.5上试用过,效果非常好。

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

我已经在MySQL 5.5上试用过,效果非常好。

原因如下(如上所述):

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

要纠正这个问题,您所要做的就是定义一个不同的查询终止符。请注意模式和查询面板([;])下的下拉框/按钮-单击该下拉框/按钮,您可以选择分号以外的内容(默认值)。然后,您的两条语句将作为同一批的一部分包含在一起,您将得到想要的结果。例如: 原因如下(如上所述):

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

要纠正这个问题,您所要做的就是定义一个不同的查询终止符。请注意模式和查询面板([;])下的下拉框/按钮-单击该下拉框/按钮,您可以选择分号以外的内容(默认值)。然后,您的两条语句将作为同一批的一部分包含在一起,您将得到想要的结果。例如:

你在使用哪个版本的MySQL?我链接的sql FIDLE是MySQL 5.5.25你在使用哪个版本的MySQL?我链接的sql FIDLE是MySQL 5.5.25我链接的sql FIDLE是MySQL 5.5.25我链接的sql FIDLE是MySQL 5.5.25出于好奇-我正在征求关于如何更好地实现此功能的建议在ux.se上显而易见:出于好奇,我正在征求关于在ux.se上使此功能更加显而易见的更好方法的建议: