質問

レストランチェーンのGPSロケーションがあるテーブルがあり、特定の半径内で最も近い(a)に最も近いレストランの住所を返したいと思います。

SELECT *
    , MIN(distance($lat, $lon, lat, lon)) as miles 
FROM all_restaurants 
WHERE lat between $lat1 and $lat2 
    AND lon between $lon1 and $lon2 
    AND miles < $miles 
GROUP BY restaurant_id 
ORDER BY miles ASC
    , company_name ASC 
LIMIT 500

エラーを返します

集計の誤用:min()

役に立ちましたか?

解決 3

ラマックはやや正しかったが、これは私が代わりにやってしまったことだ

SELECT *, distance('+lat+','+lon+', lat, lon) as minmiles
FROM all_restaurants 
WHERE restaurant_id || minmiles IN 
( 
    SELECT restaurant_id || MIN(miles) as fewmiles 
    FROM ( 
        SELECT restaurant_id, distance('+lat+','+lon+', lat, lon) as miles 
        FROM restaurant_master_combined 
        WHERE lat BETWEEN $lat AND $lat2 AND lon BETWEEN $lon1 AND $lon2 AND miles < $miles
    ) 
    GROUP BY restaurant_id 
)
ORDER BY ROUND(minmiles) ASC, company_name ASC 

これが他の誰かを助けることを願っています

他のヒント

あなたの問題は、あなたがグループをグループ化しているだけだと思います restaurant_id. 。集約関数を次のように使用する場合 MIN, MAX, SUM, AVG, 、など、すべての列をに含める必要があります SELECT 集約関数にないステートメント。この場合、2つのオプションがあります。 SELECT あなたは置くだけです restaurant_id 次のように:

SELECT restaurant_id 
        , MIN(distance($lat, $lon, lat, lon)) as miles 
    FROM all_restaurants 
    WHERE lat between $lat1 and $lat2 
        AND lon between $lon1 and $lon2 
        AND miles < $miles 
    GROUP BY restaurant_id 
    ORDER BY miles ASC
        , company_name ASC 
    LIMIT 500

または、グループに「*」に含まれる他のすべての列を配置します(使用できないため GROUP BY *).

私はあなたがそれである関数を呼んでいることに違いない distance($lat, $lon, lat, lon), 、 そうでしょう?

間に簡単な減算を使用してみましたか $latlat そして、それを使用して最小値を返すようにします MIN 働き?

MINの目的は、テーブルフィールドでの使用または減算などの基本的な操作を使用することです。これは、遭遇したエラーの原因かもしれません。

何よりも、使用しないでください * 集約関数を使用している間、必要な列をクエリにリストします。

おそらく、サンプルデータを提供することは、私たちがあなたを通り抜ける方法を見つけるのに役立つかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top