Sql 续集:PG::UndefinedColumn:错误:column";“距离”;不存在
我正在尝试使用此查询获取附近企业的列表:Sql 续集:PG::UndefinedColumn:错误:column";“距离”;不存在,sql,ruby,postgresql,sequel,Sql,Ruby,Postgresql,Sequel,我正在尝试使用此查询获取附近企业的列表: 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 distan
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:ERROR:列“distance”不存在
距离不是表中的一列,但我在查询中将其创建为一个计算列,因此它应该可以工作,但不是吗
有什么想法吗?您使用的查询是从MySQL中挖出的,在MySQL中,select别名可以在
HAVING
子句中使用。但是在Postgres中,您必须要么子查询,要么只是重复距离公式。以后一个选项为例,下面是哈弗森查询的一个可行版本:
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;
选择
身份证件
(3959*acos(cos(弧度(37))*cos(弧度(lat))*cos(弧度(ln)-弧度(?)+sin(弧度(?))*sin(弧度(lat)))作为距离
从商
哪里
(3959*acos(弧度(37))*cos(弧度(纬度))*cos(弧度(lng)-弧度(?)+sin(弧度(?))*sin(弧度(纬度)))
< ?
订购人
距离;
您使用的查询是从MySQL中挖出的,在MySQL中,select别名可以在HAVING
子句中使用。但是在Postgres中,您必须要么子查询,要么只是重复距离公式。以后一个选项为例,下面是哈弗森查询的一个可行版本:
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;
选择
身份证件
(3959*acos(cos(弧度(37))*cos(弧度(lat))*cos(弧度(ln)-弧度(?)+sin(弧度(?))*sin(弧度(lat)))作为距离
从商
哪里
(3959*acos(弧度(37))*cos(弧度(纬度))*cos(弧度(lng)-弧度(?)+sin(弧度(?))*sin(弧度(纬度)))
< ?
订购人
距离;
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;
选择b.id,v.distance
从业务b交叉连接横向
(值(3959*acos(cos(弧度(37))*cos(弧度(b.lat))*cos(弧度(b.lng)-弧度(?)+sin(弧度(?))*sin(弧度(b.lat)))
)
)v(距离)
其中v.distance<?
按距离排序;
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;
选择b.id,v.distance
从业务b交叉连接横向
(值(3959*acos(cos(弧度(37))*cos(弧度(b.lat))*cos(弧度(b.lng)-弧度(?)+sin(弧度(?))*sin(弧度(b.lat)))
)
)v(距离)
其中v.distance<?
按距离排序;