2014-10-03 2 views
0

Я пытаюсь вернуть только строки, где широта и долгота, передаваемые в запрос по сравнению с широтой и долготой, хранящейся в базе данных, находятся на расстоянии нескольких миль друг от друга.Виртуальная колонка неизвестна при сравнении lat lng

Запрос выглядит следующим образом:

SELECT 
    c.google_theatre_id 
    AS cinema_id, 
    c.name 
    AS cinema_name, 
    (3959 * acos(cos(radians('50.4521013')) * 
    cos(radians(latitude)) * 
    cos(radians(longitude) - 
    radians('-3.5247389')) + 
    sin(radians('50.4521013')) * 
    sin(radians(latitude)))) 
    AS distance 
FROM 
    google_cinemas c, app_users u 
WHERE 
    distance < u.range 
AND 
    u.id = 126 
ORDER BY 
    distance 

Запрос предназначен для получения расстояния, а затем сравнить его на колонку (range) в app_users таблице.

При выполнении запроса, я получаю сообщение об ошибке distance, являющееся неизвестным столбцом.

Как это виртуальная колонка, есть ли другой способ сравнения?

Спасибо :)

+0

Попробуйте использовать 'HAVING'. MySQL не позволяет ссылаться на столбцы псевдонимов в 'WHERE' –

ответ

1

вам нужно использовать HAVING вместо WHERE .. думаю об этом так ГДЕ, когда вы делаете заказ на сдержанность и HAVING выбирает материал от плиты, когда дело доходит до вашего таблица ... вы не можете ссылаться на псевдоним, прежде чем пластина приходит к столу только после того, как он был построен

SELECT 
    c.google_theatre_id AS cinema_id, 
    c.name AS cinema_name, 
    (3959 * acos(cos(radians('50.4521013')) * 
     cos(radians(latitude)) * 
     cos(radians(longitude) - 
     radians('-3.5247389')) + 
     sin(radians('50.4521013')) * 
     sin(radians(latitude))) 
    ) AS distance 
FROM google_cinemas c, app_users u 
WHERE u.id = 126 
HAVING distance < u.range 
ORDER BY distance 

в качестве альтернативы вы можете использовать его в качестве суб запроса, который может быть быстрее, так как HAVING переоценивает весь запрос ,

SELECT * 
FROM 
( SELECT 
     c.google_theatre_id AS cinema_id, 
     c.name AS cinema_name, 
     (3959 * acos(cos(radians('50.4521013')) * 
      cos(radians(latitude)) * 
      cos(radians(longitude) - 
      radians('-3.5247389')) + 
      sin(radians('50.4521013')) * 
      sin(radians(latitude))) 
     ) AS distance, 
     u.range 
    FROM google_cinemas c, app_users u 
    WHERE u.id = 126 
    ORDER BY distance 
)t 
WHERE distance < range 
+0

Это странно, но приятно, аналогия. +1 –

+0

@ ʰᵈˑ ха-ха благодарит его хороший способ объяснить это людям визуально ... таким образом они могут понять, как это работает упрощенным способом :) –

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