MYSQL: Как правильно использовать внешние псевдонимы в подзапросе? - PullRequest
2 голосов
/ 03 октября 2011

Первый запрос работает просто отлично. Возвращает одну строку из таблицы «точка маршрута». У этого есть определенный 'route_id', и 'geo_distance ()' находится на минимуме, учитывая параметры. Я знаю, что подзапрос в разделе FROM кажется излишне сложным, но на мой взгляд он помогает выделить проблему со вторым запросом.

Различия в последних двух строках.

SELECT rp.*

FROM routepoint rp, route r, (SELECT * FROM ride_offer WHERE id = 6) as ro

WHERE rp.route_id = r.id
AND r.id = ro.current_route_id
AND geo_distance(rp.lat,rp.lng,52372070,9735690) = 

(SELECT MIN(geo_distance(lat,lng,52372070,9735690)) 
FROM routepoint rp1, ride_offer ro1 
WHERE rp1.route_id = ro1.current_route_id AND ro1.id = 6);

Следующий запрос не работает вообще. Он полностью зависает MySQL и я должен перезагрузить. Что я делаю неправильно? Первый подзапрос возвращает ровно одну строку. Я не понимаю разницу.

SELECT rp.*

FROM routepoint rp, route r, (SELECT * FROM ride_offer WHERE id = 6) as ro

WHERE 
rp.route_id = r.id
AND r.id = ro.current_route_id
AND geo_distance(rp.lat,rp.lng,52372070,9735690) = 

(SELECT MIN(geo_distance(lat,lng,52372070,9735690)) 
FROM routepoint rp1 
WHERE rp1.route_id = ro.current_route_id);

1 Ответ

1 голос
/ 03 октября 2011

Проблема, как указал Ромен, в том, что это дорого.

В этой статье описан алгоритм, который снижает стоимость за 2 этапа.

Шаг 1. Найдите ограничивающую рамку, которая содержит хотя бы одну точку.

Шаг 2. Найдите ближайшую точку, изучив все точки в ограничительной рамке, которые должны быть сравнительно небольшими, поэтому не такими дорогими.

...