2014-07-11 30 views
1

我是一個MySQL的noob,今天我試圖建立一個超過5行長的MySQL調用。我不斷收到我嘗試修復幾個小時的語法錯誤,但我不知道問題出在哪裏。這裏是代碼: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 ..」語句中添加了分號,現在前三個語句都可以。

更新2:增加了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 

親切的問候, 西奧

+3

顯示*全*錯誤信息 –

+1

是分享實際的錯誤信息所需要的最明顯的修正。 –

+0

如果您一次執行所有語句,則可能需要在每個語句的末尾添加分號。 – Othya

回答

0

流程控制語句,其中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 ; 

然後調用它:

CALL MYPROC(); 

請參閱本SQLFiddle的這個工作的簡化版本。

請注意,你有一個語法錯誤:

@ID = @ID + 1; -- incorrect syntax 
SET @ID := @ID + 1; -- correct 
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; 
+0

謝謝!我試過你的一段代碼,並且出現以下錯誤:第5行中出現錯誤1064(42000):你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以找到正確的語法,以便在第5行'WHERE sp.trip_id BETWEEN @ID和'@maxID'處使用' –

+0

我省略了右括號,並且通過編輯以上。順便說一句,作爲程序員,你應該能夠發現錯誤並自己糾正錯誤。 –

+0

好吧,現在你的代碼運行沒有錯誤,但我不得不在10分鐘後停止它,沒有結果。問題是,我真的需要首先用@ID分割兩個數據集,因爲它們都有數以百萬計的條目和複雜性爆炸。 –