次のフィールドで構成されるテーブル (cargo_route) があります。
ID、トラック ID、
緯度、
経度
、
半径
これは、各行がトラックの緯度経度座標の各停留所である配送ルートです。
各ストップと (任意の入力) ポイント (緯度経度) の間の距離を計算し、その距離が (そのストップの) 指定された半径よりも小さい場合に結果を表示する必要があります。(基本的には都市がルート上にあるか、ルート上のどの停留所からも遠すぎるかを検索します)
HEREは私のクエリです(正常に動作します)
SELECT
`truck_id`,
`radius`,
(
3959 * acos(
cos(radians(39.9611755)) * cos(radians(cargo_route.lat)) * cos(
radians(cargo_route.lon) - radians(- 82.9987942)
) + sin(radians(39.9611755)) * sin(radians(cargo_route.lat))
)
) AS distance FROM
(`cargo_route`) HAVING `distance` < `radius`
コードは機能します....しかし、同じtruck_idを持ついくつかの行が表示されます(基本的に、検索されたポイントに十分近いすべての停留所)
ポイントを通過するトラックのIDのみを取得するために「GROUP BY truck_id」を試行すると、空のセットが取得されます:(
PHPロジック内でこれを解決できますが、配列を反復処理するよりも、SQLに本当に必要なものを返してもらいたいです。
私は調査を行い、GROUP BY が最初に実行され、HAVING は距離 < 半径を持たないことになることを知りました。ORDER Bも試しましたが効果なし。
HEre は EMPTY SET を返すクエリです
SELECT
`truck_id`,
`radius`,
(
3959 * acos(
cos(radians(39.9611755)) * cos(radians(cargo_route.lat)) * cos(
radians(cargo_route.lon) - radians(- 82.9987942)
) + sin(radians(39.9611755)) * sin(radians(cargo_route.lat))
)
) AS distance FROM
(`cargo_route`) GROUP BY truck_id HAVING `distance` < `radius`
質問: HAVING を実行してからグループ化する方法はありますか? おそらく少し異なる構文ですか?
HAVING と GROUP BY を並べ替えてみましたが、エラーが発生します。また、「距離」は集計列であるため、WHERE を使用できません。
************編集_解決済み*******************
私自身の質問に答えることができません:
みんな、実際にここで答えを見つけました:SELECT From MySQL View With HAVING Clause Returns Empty Result Set
基本的に、 SELECT * FROM (私のクエリ) S WHERE 距離 < 半径 GROUP BY トラック ID