比较lat lng时虚拟列未知

时间:2014-10-03 15:31:47

标签: mysql sql

我试图只返回传递给查询的纬度和经度的行,与存储在数据库中的纬度和经度相比,相隔一定距离。

查询如下:

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是未知列。

由于这是虚拟列,是否有不同的比较方式?

谢谢:)

1 个答案:

答案 0 :(得分: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