基于坐标之间的距离选择位置

时间:2016-06-26 15:41:29

标签: php sql coordinates pgadmin

我尝试制作一个代码来计算某个给定坐标的最近位置。但是我遇到了以下错误:

ERROR: column "distance" does not exist  
LINE 5: `HAVING distance < 150`  
in ROOT\frontend3.php on line 16. 

从pgadminIII数据库中检索数据。欢迎所有帮助

<?php 

include 'connection.php';

$lat = $_GET['lat'];
$lng = $_GET['lng'];

#Select inormation from Parking database
$result = pg_query($conn, "
SELECT id, ( 6371 * acos( cos( radians($lat) ) * cos( radians( lat ) ) *     cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ) 
AS distance 
FROM parking
HAVING distance < 150 
ORDER BY distance 
LIMIT 10
");
echo $result;

2 个答案:

答案 0 :(得分:1)

having用于分组/聚合内容并在分组后需要条件。在您的情况下,您需要使用where

SELECT   id, ( ... ) AS distance 
FROM     parking
WHERE    distance < 150 
ORDER BY distance 
LIMIT    10

答案 1 :(得分:0)

SELECT
    id
    ,( 6371 * acos( cos( radians($lat) ) * cos( radians( lat ) ) *     cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ) AS distance 
FROM parking
WHERE
    ( 6371 * acos( cos( radians($lat) ) * cos( radians( lat ) ) *     cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ) < 150
ORDER BY distance 
LIMIT 10;

2个问题使用group by进行聚合时使用HAVING,并在数据集之后应用。所以where语句更适合你。第二个距离是列别名,因此通过将整个计算放在where子句中,您可以在where子句中使用它。或者使用子选择。

SELECT *
FROM (
    SELECT
       id
       ,( 6371 * acos( cos( radians($lat) ) * cos( radians( lat ) ) *     cos( radians( lng ) - radians($lng) ) + sin( radians($lat) ) * sin( radians( lat ) ) ) ) AS distance 
    FROM parking
) t
WHERE
    distance < 150
ORDER BY distance 
LIMIT 10;