2012-05-18 6 views
7

मैं संग्रहीत प्रक्रिया बनाने की कोशिश कर रहा हूं। यहां मेरे पास अब तक है (काम नहीं कर रहा है):SELECT कथन से MySQL संग्रहीत प्रक्रिया चर

DELIMITER | 
CREATE PROCEDURE getNearestCities(IN cityID INT) 
    BEGIN 
     DECLARE cityLat FLOAT; 
     DECLARE cityLng FLOAT; 
     SET cityLat = SELECT cities.lat FROM cities WHERE cities.id = cityID; 
     SET cityLng = SELECT cities.lng FROM cities WHERE cities.id = cityID; 
     SELECT *, HAVERSINE(cityLat,cityLng, cities.lat, cities.lng) AS dist FROM cities ORDER BY dist LIMIT 10; 
    END | 

हैवरसिन एक ऐसा फ़ंक्शन है जो मैंने बनाया है जो ठीक काम करता है। जैसा कि आप देख सकते हैं कि मैं शहरों की मेज से शहर की आईडी लेने की कोशिश कर रहा हूं और फिर उस रिकॉर्ड के कुछ अन्य मूल्यों के लिए शहर लाट और सिटीएलजी सेट कर रहा हूं। मैं स्पष्ट रूप से SELECTs का उपयोग कर यह गलत कर रहा हूँ।

क्या यह भी संभव है। ऐसा लगता है कि यह होना चाहिए। किसी भी मदद की सराहना की जाएगी। आप MySQL के SELECT ... INTO सिंटैक्स का उपयोग कर सकते हैं

SET cityLat = (SELECT cities.lat FROM cities WHERE cities.id = cityID); 

वैकल्पिक रूप से,:

उत्तर

12

कुछ चीजों को ठीक किया और एक वैकल्पिक चयन जोड़ा - उचित के रूप में हटाएं।

DELIMITER | 

CREATE PROCEDURE getNearestCities 
(
IN p_cityID INT -- should this be int unsigned ? 
) 
BEGIN 

DECLARE cityLat FLOAT; -- should these be decimals ? 
DECLARE cityLng FLOAT; 

    -- method 1 
    SELECT lat,lng into cityLat, cityLng FROM cities WHERE cities.cityID = p_cityID; 

    SELECT 
    b.*, 
    HAVERSINE(cityLat,cityLng, b.lat, b.lng) AS dist 
    FROM 
    cities b 
    ORDER BY 
    dist 
    LIMIT 10; 

    -- method 2 
    SELECT 
     b.*, 
     HAVERSINE(a.lat, a.lng, b.lat, b.lng) AS dist 
    FROM  
     cities AS a 
    JOIN cities AS b on a.cityID = p_cityID 
    ORDER BY 
     dist 
    LIMIT 10; 

END | 

delimiter ; 
13

आप बस से संकेत मिलता है कि वे सबक्वेरी हैं कोष्ठक में अपने SELECT बयान संलग्न करने की जरूरत है।

SELECT lat, lng INTO cityLat, cityLng FROM cities WHERE id = cityID; 

हालांकि, पूरे प्रक्रिया एक भी स्वयं में शामिल हो गए SELECT बयान के साथ बदला जा सकता है:

SELECT b.*, HAVERSINE(a.lat, a.lng, b.lat, b.lng) AS dist 
FROM  cities AS a, cities AS b 
WHERE a.id = cityID 
ORDER BY dist 
LIMIT 10; 
इस दृष्टिकोण का एक लाभ यह है कि दोनों cityLat और cityLng एक एकल तालिका-उपयोग से सौंपा जा सकता है है

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^