2016-06-26 21 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

ありがとうございます!しかし、私はまだエラーが発生します:「FROM」または「FROM」の近くで文法エラーが発生しました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の問題は、グループを使用するときに集計用で使用されて有するデータセットの後に適用されます。だからどこのステートメントがあなたのためにもっと適切だろう。 2番目の距離は列のエイリアスなので、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; 
関連する問題