4

在我的應用程序中,我們要求用戶輸入一個郵政編碼查詢附近的位置。我們使用郵編的LatLng對象作爲原點,然後繪製一個想象的「邊界框」來查詢數據庫中該範圍內的所有位置。這些位置會在地圖上顯示爲用戶能夠看到的標記。我們想把結果限制在10-15左右。數據庫的獲取附近位置的最佳方法?

例子:

database

我想使用MySQL的BETWEEN運營商垂直和水平方向±2度以內進行查詢,然後LIMIT n這些結果的和,我也可以將整個數據庫拉入PHP然後使用range()進行抽象。

我真的不知道什麼是接近最好的辦法,所以我會很感激,如果你有類似處理之前,這一幕,並可以提供有關如何解決它的一些見解。

+1

我會強烈建議不拉整個表到PHP。隨着表格的增大,它會影響表現。我建議儘量限制數據集,然後再將其放到前端。 – afuzzyllama 2012-02-06 21:28:10

回答

4

做它的SQL

SELECT 
    id, 
    (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance 
FROM 
    markers 
HAVING 
    distance < 25 
ORDER BY 
    distance 
LIMIT 
    0 , 20; 

http://code.google.com/apis/maps/articles/phpsqlsearch.html

+0

不幸的是,這並在每一行的計算,因此可能會打你的DB硬..看到這個問題:http://stackoverflow.com/questions/5236921/geo-search-distance-in-php-mysql-performance – konsolenfreddy 2012-02-06 19:36:38

+0

如果您的索引正確完成,則不行。我們運營了一家店鋪定位器的網站,其運營方式與此類似。從來沒有一個問題。 – thenetimp 2012-02-06 19:38:35

+0

我相信你可以對位置做一些估計,所以你可以用WHERE子句去掉一些記錄。 – afuzzyllama 2012-02-06 21:29:11