2016-05-16 109 views
0

基本上我有以下存儲過程:MySQL存儲過程中,如何插入多個變量,CONCAT

BEGIN 
SET @query := CONCAT("SELECT *, 
sqrt( 
     (POW(a.Latitude - co.CenterLatitude, 2)* 68.1 * 68.1) + 
     (POW(a.Longitude - co.CenterLongitude, 2) * 53.1 * 53.1) 
) AS distance 
FROM table1 as r 
JOIN table2 as co ON co.field1 = r.field2 
JOIN table3 AS a ON r.field1 = a.field2 
WHERE ",rid); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END 

它具有以下經過:

IN rid varchar(500), lat double, lon double 

但我需要通過在經度和緯度變量。我試圖設置它們,然後將它們添加到查詢中,但它不能識別它們。這是我正在嘗試做哪些不成功:

BEGIN 
    SET @lat := lat; 
    SET @lon := lon; 
    SET @query := CONCAT("SELECT *, 
    sqrt( 
      (POW(a.Latitude - @lat, 2)* 68.1 * 68.1) + 
      (POW(a.Longitude - @lon, 2) * 53.1 * 53.1) 
    ) AS distance 
    FROM table1 as r 
    JOIN table2 as co ON co.field1 = r.field2 
    JOIN table3 AS a ON r.field1 = a.field2 
    WHERE ",rid); 

    PREPARE stmt FROM @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    END 

我不知道如何做到這一點。有沒有人有什麼建議?先謝謝你!!

+0

你不能只是它們包括在級聯像你一樣'rid'? – Uueerdo

+0

你能舉個例子嗎? – lov2code

回答

3

您可以在準備好的語句中放置?佔位符,然後在執行時提供值。

SET @query := CONCAT("SELECT *, 
sqrt( 
     (POW(a.Latitude - ?, 2)* 68.1 * 68.1) + 
     (POW(a.Longitude - ?, 2) * 53.1 * 53.1) 
) AS distance 
FROM table1 as r 
JOIN table2 as co ON co.field1 = r.field2 
JOIN table3 AS a ON r.field1 = a.field2 
WHERE ",rid); 
PREPARE stmt FROM @query; 
EXECUTE stmt USING @lat, @lon; 
+0

我剛剛試過這個,響應時間大約是以前的8倍,你有什麼想法,爲什麼這可能是? – lov2code

+0

謝謝你的回答! – lov2code

+0

想通了,非常感謝你!奇蹟般有效 :) – lov2code

1

Barmar的答案會是我的首選解決方案,但給我的就是我最初的註釋的一個例子是在暗示......

BEGIN 
SET @query := CONCAT("SELECT *, 
sqrt( 
     (POW(a.Latitude - ", lat, ", 2)* 68.1 * 68.1) + 
     (POW(a.Longitude - ", lon, ", 2) * 53.1 * 53.1) 
) AS distance 
FROM table1 as r 
JOIN table2 as co ON co.field1 = r.field2 
JOIN table3 AS a ON r.field1 = a.field2 
WHERE ",rid); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END