2011-12-30 11 views
6

Jak mogę użyć mojego aliasu kolumnowego (łata i lng) z dwóch podkwerend, aby wykonać obliczenia odległości pod spodem? To, co zasadniczo próbuję zrobić, to obliczyć odległość między dwiema lokalizacjami, używając wartości długości i szerokości geograficznej. Ale w jakiś sposób moje aliasy są nieprzydatne w zapytaniu, dlaczego?Jak używać aliasu kolumny MySQL do obliczeń?

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

Dlaczego w wyrażeniu wkładasz lat i lng w cudzysłów? –

+0

Czy działa bez błędów lub czy podczas wykonywania tego zapytania występują błędy? – Lion

+0

Cytaty są potrzebne do uruchomienia zapytania, nie otrzymuję błędów i wszystko jest zwracane poprawnie, z tym że obliczenie odległości zwraca tę samą wartość dla wszystkich rekordów, co oznacza, że ​​wprowadzone wartości nie są używane do niczego. Co ja tu robię źle? – Chris

Odpowiedz

4

OK, co trzeba zrobić tutaj jest przyłączyć się do tej samej tabeli (wp_postmeta) dwa razy pod różnymi pseudonimami, dzięki czemu można korzystać z różnych „gdzie” warunki. Nie mam tabele, więc nie mogę tego sprawdzić, ale to podejście będziemy chcieli użyć:

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 

może mam jakieś błędy składni tam, ale wierzę, że logika jest z grubsza poprawne. Daj mi znać, czy to działa.

+1

Dziękuję za sugestie! Próbowałem Twojego zapytania, ale otrzymałem ten sam błąd co poprzednio. ** Nieznana kolumna "lat" w 'liście pól' **. Czy jest możliwe, że aliasy nie mogą być przywoływane w obliczeniach? – Chris

+0

Hmm ... Wątpię, ale dalej edytuj zapytanie, aby cos (radian ('lat')) stało się cos (radian (' alias_1'.meta_value)) i zobacz, co się stanie. Zamknąłem lat i lng w tyłach j ust na dobry środek. –

+0

Myślę, że to zrobiło! Otrzymuję teraz działającą kwerendę, a kolumna odległości daje mi teraz wyniki, chociaż nie jestem pewien, czy są poprawne. Jeden z wyników brzmi "5.89936971664429e-05", co wydaje się dziwne? – Chris

1

Po utworzeniu aliasu (który należy dodać cytaty przed i po) nie należy odwoływać się do niej jako ciąg ... kolejne odniesienia do aliasu powinien być ujęty w 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

Otrzymuję komunikat "Nieznana kolumna" w polu listy "". Przypuszczam, że aliasy nie mogą być tak określone? – Chris

+0

Ah! Masz również inny problem. Nie powinieneś mieć wielu instrukcji select, chyba że używasz podkwerendy. Wystarczy użyć "SELECT wp_posts. *, Wp_postmeta.meta_value jako" lat ", wp_postmeta.meta_value jako' lng' Z wp_posts, wp_postmeta WHRE [WYŚWIETL WSZYSTKIE SWOJE WARUNKI] –

+0

Ale potrzebuję wartości z tych pól (lat/lng) dla obliczenie odległości - stąd podzapytania – Chris