我正在尝试使用此查询获取附近的商家列表:
['1600', '1601']
['1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998']
['2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010']
['2012', '2013', '2014', '2015']
运行此命令后:
query = "SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance FROM businesses HAVING distance < ? ORDER BY distance"
我得到PG :: UndefinedColumn:错误:列“距离”不存在。
距离不是表中的一列,但是我在查询中将其创建为计算列,因此它应该可以工作,但不是吗?
有什么想法吗?
答案 0 :(得分:1)
您使用的查询是从MySQL挖走的,可以在HAVING
子句中使用选择别名。但是在Postgres中,您将必须子查询或仅重复距离公式。以后一个选项为例,这是Haversine查询的一个可行版本:
SELECT
id,
( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance
FROM business
WHERE
( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) )
< ?
ORDER BY
distance;
答案 1 :(得分:0)
Postgres支持横向联接,因此您可以在没有子查询或CTE的情况下执行以下操作:
SELECT b.id, v.distance
FROM business b CROSS JOIN LATERAL
(VALUES ( 3959 * acos( cos( radians(37) ) * cos( radians( b.lat ) ) * cos( radians( b.lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( b.lat ) ) )
)
) v(distance)
WHERE v.distance < ?
ORDER BY distance;