Mysql Рекурсивный запрос / Сферический закон косинусов - PullRequest
2 голосов
/ 31 декабря 2010

Я хочу искать ближайшие местоположения из координат (широта / долгота) в базе данных 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 - радиус Земли (км), 111(км) - 1 ° широты, cos (широта) * 111 (км) - 1 ° долготы, а 5 (км) - радиус поиска.

Проблема: я хочу найти как минимум 8 городов, ноРадиус 5 км является небольшим, но быстрым для сжатой зоны (во многих городах), поэтому, если я использую search radius слишком большой для сжатой зоны, запрос будет медленным (много результатов: упорядочить по), но для неконденсированной - search radiusслишком мал, чтобы найти хотя бы 8 городов ...

Как я могу сделать рекурсивный запрос, который автоматически увеличивает search radius (x2), если количество найденных городов <8 (используется только mysql)? </p>

Спасибо

1 Ответ

3 голосов
/ 31 декабря 2010

MySQL не поддерживает рекурсивные запросы.

Вы должны сделать новые запросы в зависимости от результата предыдущего запроса.

Кстати, для пространственных запросов я бы порекомендовал пространственную базу данных .

...