2016-06-26 4 views
0

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

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; 

ответ

1

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

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

Спасибо! однако я все еще получаю сообщение об ошибке ERROR: синтаксическая ошибка или рядом с «FROM» LINE 5: FROM parking^в строке ROOT 15 (идеи?) –

+0

К сожалению, я помещаю предложение WHERE в неправильное место. Пожалуйста, замените предложение FROM и WHERE. Обновлено. – trincot

+0

Это ответ на ваш вопрос? – trincot

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 выпуска 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^