Ciao a tutti, ho trovato su internet un modo per elencare i POI più vicini all'utente (partendo dalle sue coordinate). Sempre la stessa guida parlava di utilizzare le stored procedure per velocizzare le query nel caso ci fossero molti record all'interno del database (ed essendo molti POI effettivamente è così).
Questa quindi la funzione suggerita:
codice:
CREATE PROCEDURE testlocalize (IN userid int, IN dist int)
BEGIN
DECLARE mylon DOUBLE;
DECLARE mylat DOUBLE;
DECLARE lon1 FLOAT;
DECLARE lon2 FLOAT;
DECLARE lat1 FLOAT;
DECLARE lat2 FLOAT;
-- get the original lon and lat for the userid
SELECT ute_lon, ute_lat INTO mylon, mylat FROM utenti WHERE ute_id=userid LIMIT 1;
-- calculate lon and lat for the rectangle:
SET lon1 = mylon-dist/ABS(COS(RADIANS(mylat))*111);
SET lon2 = mylon+dist/ABS(COS(RADIANS(mylat))*111);
SET lat1 = mylat-(dist/111);
SET lat2 = mylat+(dist/111);
-- run the query:
SELECT destination.*,
6371 *
2 *
ASIN(
SQRT(
POWER(SIN((biz_lat - poi_lat) * PI()/180 / 2), 2) +
COS(biz_lat * pi()/180) *
COS(poi_lat * pi()/180) *
POWER(SIN((biz_lon - poi_lon) * PI()/180 / 2), 2)
)
) AS distance
FROM test_poi destination, utenti origin
WHERE origin.ute_id=userid
AND destination.poi_lon BETWEEN lon1 AND lon2
AND destination.poi_lat BETWEEN lat1 AND lat2
HAVING distance <= dist
ORDER BY distance;
END; //
Le query prese singolarmente ed eseguite su phpmyadmin funzionano senza problemi (ovviamente provando valori "a caso"), mentre richiamandola completamente, sempre via phpmyadmin, ottengo il seguente errore:
#1312 - PROCEDURE database.testlocalize can't return a result set in the given context
Come ulteriore prova ho creato la seguente procedura:
codice:
CREATE PROCEDURE testcoord (IN userid int, IN dist int, OUT mylon DOUBLE, OUT lon1 FLOAT)
BEGIN
DECLARE mylon DOUBLE;
DECLARE mylat DOUBLE;
DECLARE lon1 FLOAT;
DECLARE lon2 FLOAT;
DECLARE lat1 FLOAT;
DECLARE lat2 FLOAT;
-- get the original lon and lat for the userid
SELECT ute_lon, ute_lat INTO mylon, mylat FROM users WHERE ute_id=userid LIMIT 1;
-- calculate lon and lat for the rectangle:
SET lon1 = mylon-dist/ABS(COS(RADIANS(mylat))*111);
SET lon2 = mylon+dist/ABS(COS(RADIANS(mylat))*111);
SET lat1 = mylat-(dist/111);
SET lat2 = mylat+(dist/111);
END; //
Anche in questo caso eseguendo
codice:
CALL testcoord( 1, 1000, @mylon , @lon1 ); SELECT @mylon , @lon1 ;
Mi viene mostrata una tabella con valori Null
Avete suggerimenti da darmi per risolvere il problema?