-1

次のフィールドで構成されるテーブル (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

4

4 に答える 4

2

質問:HAVINGを実行してからグループ化する方法はありますか?

HAVING出力データをフィルタリングするためのものです。WHERE入力データを操作します。

おそらくこのように、いくつかのサブクエリを使用する必要があります。

SELECT `truck_id`, `radius`, `distance`
FROM
(
    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`;
于 2013-03-05T00:55:07.513 に答える
1

これは集計データを処理するためのものであることを忘れないでくださいhaving(つまり、使用したい場合はhaving、グループ化基準を定義する必要があります)。

私が保持しているクイックガイドは次のとおりです

select [the data you want]
from [the tables you have]
where [the filters you need to apply ON YOUR "RAW" DATA]
group by [your grouping criteria]
having [the filters you need to apply TO THE GROUPED DATA]
于 2013-03-05T00:49:34.630 に答える
1

MySQL はあなたを迷わせています。あなたのために働く構文は、実際には違法です。

述べた意図に基づいて、haing 句は where である必要があります。

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`) where (
    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))
    )
)` < `radius`
于 2013-03-05T00:56:57.473 に答える
0

距離評価を WHERE 句に直接移動するとうまくいくかもしれません。すべて (GROUP BY なし) をサブクエリにラップし、親クエリの GROUP BY にラップすることもできます。

于 2013-03-05T00:46:39.227 に答える