2016-05-16 3 views
0

Grundsätzlich habe ich die folgende gespeicherte Prozedur:MySql gespeicherte Prozedur, wie mehr als eine Variable mit CONCAT einfügen

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 

Es hat die folgenden Durch:

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

Aber ich muss passieren in den Breiten- und Längenvariablen. Ich habe versucht, sie zu setzen und sie dann in die Abfrage einzufügen, aber sie werden nicht erkannt. Dies ist, was ich zu tun versucht, was nicht erfolgreich ist:

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 

Ich bin nicht sicher, wie dies zu erreichen. Hat jemand irgendwelche Vorschläge? Vielen Dank im Voraus!!

+0

konnte nicht einfach sind sie in der Verkettung zu geben, wie du getan hast "los"? – Uueerdo

+0

Können Sie mir ein Beispiel geben? – lov2code

Antwort

3

Sie können ? Platzhalter in die vorbereitete Anweisung einfügen und dann die Werte bei der Ausführung angeben.

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

Ich habe es gerade ausprobiert und die Antwortzeit ist ungefähr 8 mal so hoch wie vorher, hast du irgendeine Idee warum das so sein könnte? – lov2code

+0

Vielen Dank für die Antwort nebenbei! – lov2code

+0

Ich habe es herausgefunden, vielen Dank !! Klappt wunderbar :) – lov2code

1

Barmar Antwort wäre meine bevorzugte Lösung sein, aber ein Beispiel für meine, was meine ersten Kommentar vorschlug ...

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 
Verwandte Themen