2014-04-01 138 views
0

我正在研究PHP & MySql應用程序。這裏是我有和正在嘗試做的:基於距離的搜索和排序

我有一個機構配置文件,其中包含機構名稱,郵政編碼,region_id,類別和其他詳細信息表。用戶可以根據region_id和類別搜索一個機構。我可以SELECT * FROM TABLE WHERE category = 1 and region_id = 1。然後,我需要根據距郵政編碼升序的用戶距離對結果集進行排序。我有一個算法,將用戶postal_code轉換爲latlong,並找到每個機構的距離(對於表中的每個機構,我都有很長的距離)。

問題是我的桌子很大。當我在上面的場景中搜索時,結果集包含大約1000行。然後,我必須從用戶postal_code中找到每行的距離,然後對其進行排序。現在,它在我的本地速度很快,但我確信當它開始運行時,搜索,計算和排序需要很長時間。然後,我想通過一次顯示10個結果來解決問題,但是很明顯,這並不能解決問題,因爲我仍然必須計算距離並進行排序,然後才能顯示結果。

您認爲最好的解決方法是什麼?我正在考慮按照lat的升序進行搜索,但由於lat的長度不是線性的,所以這沒有意義。郵政編碼是加拿大的。我不知道我能否以某種方式利用它。

讓我知道你們的想法。謝謝。

+0

這取決於你計算距離的方式。如果您可以在不對每次比較運行額外查詢的情況下執行此操作(在這種情況下您應該可以執行此操作),那麼對服務器排序1000行對於您而言無關緊要,您無需擔心。 – Vatev

回答

0

我想你可以嘗試這些兩兩件事之一:

  • 使用MySQL spatial support,它需要在你的DB模式的變化,但我認爲這是典型的爲你的情況,因此它的性能應該不錯 - 按說。
  • 編寫查詢來計算SQL中的距離,而不是PHP,你不希望單個查詢計算每一個距離,對嗎?它將有這樣的事情(粗略的版本):

    SELECT ..., sqrt(
        (POW(latitude2 - latitude1, 2)) + 
        (POW(longitude2 - longitude1, 2)) 
    ) AS distance, ... 
    
+0

如果你打算使用這個,你需要用一個與地理座標一起工作的公式來代替公式。 – Vatev

+0

這2個選項是蘋果和橘子,你剛剛做出了水果雞尾酒! –

0

可以計算距離在查詢 (這是一個pasudo核桃:)

sprintf("SELECT placeName, MARKER.lat, MARKER.lng, (6371 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distanza FROM MARKERtable.... 
HAVING distanza < '%s'", $lat, $lng, $lat, $distance) 

其中$ lat和$ lan是用戶的當前位置(或由他選擇的地址)。您可以使用默認$距離或用戶選擇的一個過濾查詢結果。

我在谷歌地圖API中使用它:https://developers.google.com/maps/articles/phpsqlsearch_v3