MySQL语法:“在附近使用正确的语法” - 正好在开头

时间:2014-07-11 13:20:51

标签: mysql syntax

我是一个MySQL-noob,今天我尝试设置一个长度超过5行的MySQL调用。我一直在学习语法错误,我试着解决几个小时,但我不知道问题是什么。这是代码:

USE myDatabase;

DELIMITER //
CREATE PROCEDURE MYPROC()
BEGIN

SET @ID      = 1;
SET @maxID   = 3;

CREATE TEMPORARY TABLE resultTable(v DOUBLE, ttc DOUBLE);

WHILE (@ID < @maxID) DO

 INSERT partTable1.v, partTable2.ttc 
 INTO 
    resultTable 
 FROM
    (SELECT * FROM
            (((SELECT time_sec, v FROM speedTable WHERE (trip_id = @ID)) as partTable1) 
            INNER JOIN 
        ((SELECT time_sec, ttc FROM sightsTable WHERE (trip_id = @ID)) as partTable2)  ON
                (0.04 > abs(partTable1.time_sec - partTable2.time_sec)))
    );


SET @ID := @ID + 1;
END WHILE;
END //
DELIMITER;

CALL MYPROC();

SELECT * FROM resultTable LIMIT 100;

有什么明显的东西需要纠正吗?

Update1:​​在“CREATE ..” - 语句中添加分号,现在前三个语句都可以。

Update2:又添加了3个分号!

Update3:按照建议使其成为一个函数+单独的函数调用。错误信息已更改!

Update4:我修复了两个答案中提到的问题。还是有点不对劲。请参阅上面的更新代码和下面的错误消息。

更新了错误消息:

ERROR 1064 (42000) at line 4: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear ' partTable2.ttc
    INTO
            resultTable
    FROM
            (SELECT * FROM
                    (((SELE' at line 11

亲切的问候, 西奥

2 个答案:

答案 0 :(得分:0)

其中WHILE为1的流控制语句只能在存储过程中使用,但您尝试通过控制台将其用作普通查询。

如果您绝对必须采用此路径(使用mysql而不是应用程序语言),请使用所需的代码创建存储过程,然后调用它。

创建过程如下所示:

DELIMITER //
CREATE PROCEDURE MYPROC()
BEGIN
WHILE (@ID < @maxID) DO
    SET @partTable1 = (SELECT time_sec, v FROM speedTable WHERE (trip_id = @ID));
    SET @partTable2 = (SELECT time_sec, ttc FROM sightsTable WHERE (trip_id = @ID));

    INSERT v, ttc INTO resultTable FROM
         (@partTable1 INNER JOIN @partTable2 ON
              (0.04 > abs(partTable1.time_sec - partTable2.time_sec)));

    SET @ID := @ID + 1;
END WHILE;
END//
DELIMITER ;

然后调用它:

CALL MYPROC();

请参阅此SQLFiddle此简化版本。

请注意,您确实有一个语法错误:

@ID = @ID + 1; -- incorrect syntax
SET @ID := @ID + 1; -- correct

答案 1 :(得分:0)

还有一些语法问题和功能问题...

这个问题可能比你做的更简单。您不需要临时表,也不需要一次读取一行结果。

以下是我认为符合您的意图的例子:

USE myDatabase
SET @ID      = 1;
SET @maxID   = 3;

SELECT sp.v, si.ttc
FROM speedTable AS sp
INNER JOIN sightsTable AS si
    ON (sp.trip_id = si.trip_id AND 0.04 > ABS(sp.time_sec - si.time_sec))
WHERE sp.trip_id BETWEEN @ID AND @maxID;