MySQL语法:";使用near";的正确语法一开始
我是一个MySQL noob,今天我尝试设置一个超过5行的MySQL调用。我不断地遇到语法错误,我花了几个小时试图修复这些错误,但我不知道问题出在哪里。代码如下: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
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脚本中使用
而
。您只能在存储例程的主体中使用
。看,
- 不能使用
将多个列指定给标量。MySQL不支持关系值变量,只支持标量变量。看SET
- 您可以从带有联接的查询结果中插入
,但必须使用
引入查询。看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;