Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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语法:";使用near";的正确语法一开始_Mysql_Syntax - Fatal编程技术网

MySQL语法:";使用near";的正确语法一开始

MySQL语法:";使用near";的正确语法一开始,mysql,syntax,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 (@I

我是一个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;
亲切问候,,
o

流控制语句(其中
WHILE
是其中之一)只能在存储过程中使用,但您正试图通过控制台将其用作普通查询

如果您绝对必须采用此路径(使用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 ;
请参阅此工作的简化版本

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

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

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

  • 您不能在SQL脚本中使用
    。您只能在存储例程的主体中使用
    。看

  • 不能使用
    SET
    将多个列指定给标量。MySQL不支持关系值变量,只支持标量变量。看

  • 您可以从带有联接的查询结果中插入
    ,但必须使用
    SELECT
    引入查询。看

  • 不能将会话变量用作表的名称。你必须使用事先准备好的声明。请看,但这会打开一个完全不同的蠕虫罐,做错了可能是一个安全漏洞(请参阅)。我不建议您开始使用准备好的语句作为自我描述的MySQL noob

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

下面是一个例子,我认为它符合您的意图:

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; 

显示整个错误消息所需的最明显更正是共享实际的错误消息。如果同时执行所有语句,则可能需要在每个语句末尾添加分号。在CREATE语句后添加分号在声明临时表后添加分号。谢谢!我尝试了你的代码,我得到了以下错误:“第5行的错误1064(42000):你的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在“WHERE sp.trip_id在@id和@maxID之间的第5行”附近使用的正确语法。我省略了一个右括号,并通过编辑上面的内容对其进行了修复。顺便说一下,作为一名程序员,你应该能够发现错误并自己纠正。好的,现在你的代码运行时没有错误,但我不得不在10分钟后停止它,没有结果。问题是,我真的需要先用@ID将这两个数据集分割开来,因为它们都有数百万个条目,复杂性爆炸。我应用了你所有的更正建议,你能看一下吗?INSERT语句中没有来自
。它只是插入选择…
请阅读文档:
@ID = @ID + 1; -- incorrect syntax
SET @ID := @ID + 1; -- correct
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;