2011-10-03 105 views
2

第一個查詢工作得很好。它從表'路線點'返回一行。它有一個特定的'route_id','geo_distance()'在給定參數時處於最小值。我知道FROM部分中的子查詢似乎不必要的複雜,但在我看來,它有助於突出第二個查詢的問題。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, 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); 
+0

路線點表有多大?另外,您是否比較了兩個陳述的執行計劃? –

+1

您正在嘗試編寫依賴子查詢 - 子查詢將在外部查詢結果集的每一行執行一次,如果您有很多行,這將會非常慢 - 您會希望儘可能多地優化子查詢盡你所能。 – Romain

+0

@Klas路線點表有大約14k行,它會變得更大。 – Nielow

回答

1

問題是,正如羅曼指出的那樣,這是昂貴的。

This article描述了一種通過兩步過程降低成本的算法。

步驟1:找到至少包含一個點的邊界框。

步驟2:通過檢查邊界框中的所有點來找出最接近的點,這應該是一個相對較小的數字,因此並不那麼昂貴。

相關問題