SQLiteグループ化された結果の最小関数値を選択します
質問
レストランチェーンの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)
, 、 そうでしょう?
間に簡単な減算を使用してみましたか $lat
と lat
そして、それを使用して最小値を返すようにします MIN
働き?
MIN
の目的は、テーブルフィールドでの使用または減算などの基本的な操作を使用することです。これは、遭遇したエラーの原因かもしれません。
何よりも、使用しないでください *
集約関数を使用している間、必要な列をクエリにリストします。
おそらく、サンプルデータを提供することは、私たちがあなたを通り抜ける方法を見つけるのに役立つかもしれません。
所属していません StackOverflow