基本查询按预期工作,但当我尝试对第一列求和时,它应该是 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/0和 http://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/