Выбор мест на основе расстояния между координатами

Я пытаюсь сделать код, который вычисляет ближайшие места для определенной координаты. Однако я застрял на следующей ошибке:

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 ответа

having это когда вы группируете / агрегируете вещи и нуждаетесь в условии после этой группировки. В вашем случае вам нужно использовать where:

SELECT   id, ( ... ) AS distance 
FROM     parking
WHERE    distance < 150 
ORDER BY distance 
LIMIT    10
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 проблемы HAVING используется при группировании по группам и применяется после набора данных. Так что, где заявление будет более подходящим для вас. Второе расстояние - это псевдоним столбца, поэтому он не будет доступен в предложении 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;
Другие вопросы по тегам