2011-12-30 3 views
6

Как я могу использовать мой псевдоним столбца (lat и lng) из двух подзапросов, чтобы сделать подсчет расстояния ниже? То, что я в основном пытаюсь сделать, это вычислить расстояние между двумя точками, используя значения долготы и широты. Но почему-то мои псевдонимы не могут использоваться в запросе, почему?Как использовать псевдоним столбца MySQL для вычислений?

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

Почему вы ставите lat и lng в кавычки в своем выражении? –

+0

Выполняется ли оно без каких-либо ошибок или вы получаете некоторые ошибки при выполнении этого запроса? – Lion

+0

Кавычки необходимы для запуска запроса, я не получаю ошибок и все возвращается правильно, за исключением того, что вычисление расстояния возвращает одно и то же значение для всех записей, что означает, что введенные значения ни для чего не используются. Что я здесь делаю неправильно? – Chris

ответ

4

Хорошо, что вам нужно сделать здесь присоединиться к той же таблице (wp_postmeta) дважды под разными псевдонимами, так что вы можете использовать различные «WHERE» условия. У меня нет таблиц, поэтому я не могу проверить это, но это подход, вы хотите использовать:

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 

Я, возможно, некоторые синтаксические ошибки в там, но я считаю, что логика грубо говоря. Дайте мне знать, если это сработает.

+1

Спасибо за ваши предложения! Я попробовал ваш запрос, но получаю ту же ошибку, что и раньше. ** Неизвестный столбец «lat» в «списке полей» **. Возможно ли, чтобы псевдонимы не могли ссылаться на вычисления? для меня – Chris

+0

Хм ... Я сомневаюсь в этом, но продолжайте и редактируйте запрос так, чтобы cos (radians ('lat')) становился cos (radians (' alias_1'.meta_value)) и т. д. и смотрел, что происходит. Кроме того, Я включил lat и lng в backticks j для хорошей меры. –

+0

Я думаю, что сделал! Теперь я получаю рабочий запрос, и столбец расстояния дает мне результаты, хотя я не уверен, что они верны. Один из результатов гласит: «5.89936971664429e-05», что кажется странным? – Chris

1

После того как вы создали свой псевдоним (который вы должны добавить кавычки до и после), вы не должны ссылаться на него как строку ... последующие ссылки на псевдоним должны быть заключены в обратных кавычках:

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

Я получаю сообщение об ошибке «Неизвестный столбец« lat »в« списке полей ». Я думаю, что псевдонимы нельзя ссылаться именно так? – Chris

+0

Ах! У вас есть еще одна проблема. У вас должно быть несколько операторов выбора, если вы не используете подзапрос. Просто используйте «SELECT wp_posts. *, Wp_postmeta.meta_value как« lat », wp_postmeta.meta_value как' lng' FROM wp_posts, wp_postmeta WHRE [СПИСОК ВСЕХ ВАШИХ ГДЕ УСЛОВИЯ) –

+0

Но мне нужны значения из этих полей (lat/lng) для вычисление расстояния - следовательно, подзапросы. – Chris

Смежные вопросы