2011-12-30 13 views
6

Come posso utilizzare il mio alias di colonna (lat e lng) dalle due sottoquery per eseguire la calcografia della distanza al di sotto? Quello che sto fondamentalmente cercando di fare è calcolare la distanza tra due posizioni usando i valori di longitudine e latitudine. Ma in qualche modo i miei alias non sono utilizzabili nella query, perché?Come utilizzare un alias di colonna MySQL per i calcoli?

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS lat, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS lng, 
(3959 * acos(cos(radians(41.367682)) * cos(radians('lat')) * cos(radians('lng') -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians('lat')))) AS distance 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY ID 
ORDER BY distance ASC 
+1

Perché inserisci lat e lng tra virgolette nella tua espressione? –

+0

Viene eseguito senza errori o si verificano errori durante l'esecuzione di questa query? – Lion

+0

Le virgolette sono necessarie per eseguire la query, non ottengo errori e tutto viene restituito correttamente, tranne che il calcolo della distanza restituisce lo stesso valore per tutti i record, il che significa che i valori immessi non vengono utilizzati per nulla. Cosa sto facendo di sbagliato qui? – Chris

risposta

4

OK, che cosa dovete fare qui è aderire alla stessa tavola (wp_postmeta) due volte sotto diversi pseudonimi in modo da poter utilizzare diversi 'dove' le condizioni. Non ho le tabelle, quindi non posso verificare questo, ma questo è l'approccio che vorrete utilizzare:

SELECT wp_posts.*, 
    (`alias_1`.meta_value) AS `lat`, 
    (`alias_2`.meta_value) AS `lng`, 
    (3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts 
    LEFT JOIN `wp_postmeta` AS `alias_1` ON wp_posts.ID = alias_1.post_id 
    LEFT JOIN `wp_postmeta` AS `alias_2` ON wp_posts.ID = alias_2.post_id 
WHERE 
    wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'page' 
    AND wp_posts.post_date < NOW() 
    AND `alias_1`.meta_key = 'position' 
    AND `alias_1`.meta_value LIKE '41.%' 
    AND `alias_2`.meta_key = 'position' 
    AND `alias_2`.meta_value LIKE '2.%' 
GROUP BY wp_posts.`ID` 
ORDER BY `distance` ASC 

io possa avere alcuni errori di sintassi in là, ma credo che la logica è approssimativamente corretto. Fammi sapere se funziona.

+1

Grazie per i tuoi suggerimenti! Ho provato la tua query ma ho ricevuto lo stesso errore di prima. ** Colonna sconosciuta "lat" nella "lista dei campi" **. È possibile che gli alias non possano essere referenziati nei calcoli? – Chris

+0

Hmm ... Ne dubito, ma vai avanti e modifica la query in modo che cos (radians ('lat')) diventi cos (radians (' alias_1'.meta_value)) ecc. e vedi cosa succede. Ho inserito lat e lng nei backtick j ust per buona misura. –

+0

Penso che l'abbia fatto! Sto ottenendo una query di lavoro ora e la colonna di distanza mi sta dando risultati ora, anche se non sono sicuro che siano corretti. Uno dei risultati recita "5.89936971664429e-05", che sembra strano? – Chris

1

Una volta creato l'alias (che si dovrebbe aggiungere le virgolette prima e dopo), non si dovrebbe fare riferimento come una stringa ... successivi riferimenti al alias dovrebbe essere racchiuso in backticks:

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS 'lat', 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS 'lng', 
(3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY `ID` 
ORDER BY 'distance' ASC 

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

+0

Viene visualizzato l'errore "Colonna sconosciuta 'lat" in "elenco campi" ". Immagino che gli alias non possano essere referenziati in questo modo? – Chris

+0

Ah! Hai anche un altro problema. Non dovresti avere più istruzioni select a meno che tu non stia eseguendo una sottoquery. Basta usare "SELECT wp_posts. *, Wp_postmeta.meta_value come 'lat', wp_postmeta.meta_value come' lng' DA wp_posts, wp_postmeta WHRE [ELENCA TUTTE LE TUE CONDIZIONI) –

+0

Ma ho bisogno dei valori di quei campi (lat/lng) per il calcolo della distanza - da qui le sottoquadri – Chris

Problemi correlati