我试图只返回传递给查询的纬度和经度的行,与存储在数据库中的纬度和经度相比,相隔一定距离。
查询如下:
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 :(得分: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