2

座標 (緯度/経度) から mysql データベースに最も近い場所を検索したいのですが、これらの場所を検索するために球面余弦法を使用します。

SELECT onlycoord.id, locations.name, locations.ascii,
    locations.latitude, locations.longitude,
    locations.country, locations.elevation,
    locations.gtopo30, locations.timezone,
    (6371 * ACOS(
        COS( RADIANS( 48.48 ) ) *
        COS( RADIANS( onlycoord.latitude ) ) *
        COS(
            RADIANS( onlycoord.longitude ) -
            RADIANS( 2.20 )
        ) +
        SIN( RADIANS( 48.48 ) ) *
        SIN( RADIANS( onlycoord.latitude ) )
    )) AS distance
FROM onlycoord USE INDEX (coordinate)
    LEFT JOIN locations USE INDEX (id)
    ON (onlycoord.id = locations.id)
WHERE onlycoord.latitude BETWEEN (
    48.48 - ( 5 / 111 )
) AND (
    48.48 + ( 5 / 111 )
) AND onlycoord.longitude BETWEEN (
    2.20 - ( 5 / ABS( COS(
        RADIANS( 48.48 )
    ) * 111 ) )
) AND (
    2.20 + ( 5 / ABS( COS(
        RADIANS( 48.48 ) 
    ) * 111 ) )
)
ORDER BY distance ASC
LIMIT 0, 20

ここで、6371 は地球の半径 (km)、111 (km) は緯度の 1°、cos(latitude) * 111 (km) は経度の 1°、5 (km) は検索半径です。

問題 : 少なくとも 8 つの都市を見つけたいのですが、半径 5 km は小さいですが、凝縮ゾーン (多くの都市) では高速です。そのため、search radius凝縮ゾーンに大きすぎる値を使用すると、クエリは遅くなります (多くの結果: 並べ替え)。非凝縮の場合、search radius少なくとも 8 つの都市を見つけるには小さすぎます...

search radius見つかった都市の数が 8 未満の場合 (mysql のみを使用)、(x2)を自動的に増加させる再帰クエリを作成するにはどうすればよいですか?

ありがとう

4

1 に答える 1

3

MySQL は再帰クエリをサポートしていません。

前のクエリの結果に応じて、新しいクエリを作成する必要があります。

ちなみに、空間クエリについては、空間データベースをお勧めします。

于 2010-12-31T10:57:44.793 に答える