2012-02-20 26 views
0

我有一個用戶表,我希望其他用戶能夠按名稱搜索彼此。通常這很容易。不過,我希望名稱類似的用戶按照距離彼此相近的順序出現,因此可以說,我在尋找「邁克」,但我不知道他的姓。我想要我的結果顯示的是所有「邁克「在我的數據庫中,從最接近的一個開始。我有我的所有用戶的經度/緯度,所以這不是一個問題,問題是我的查詢當前構造的方式,我必須提供一個特定的範圍。所以我想弄明白,如果我可以構建查詢沒有範圍指定的另一種方式,所以它會從最接近最遠。mySQL查詢獲取最接近某人的記錄,基於經度和緯度無範圍

當前查詢看起來像

SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM `memb_geo_locations` HAVING `distance` < $range ORDER BY `distance` ASC" 

的另一面來,這也是我很可能將不得不以形成內部與此連接的名字我會尋找有不同的桌子底下。其中member_id是兩個表之間的鏈接。其他表將具有 member_id,名字,姓氏 地理表有 member_id,經度,緯度,主要

任何想法的?

回答

1
SELECT 
    *, 
    (((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) 
    * cos((`latitude`*pi()/180)) 
    * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` 
FROM `memb_geo_locations` 
ORDER BY `distance` DESC 

對於您的問題的第一部分只是刪除HAVING和ORDER BY DESCending。

添加加入應該足夠簡單:

SELECT 
    *, 
    (((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) 
    * cos((`latitude`*pi()/180)) 
    * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` 
FROM memb_geo_locations 
INNER JOIN members ON members.member_id = memb_geo_locations.member_id 
WHERE members.firstname LIKE 'bob or whatever%' 
ORDER BY `distance` DESC 
0

要排除的範圍內,你只是...排除範圍:

SELECT *, 
     <distance_calculation> AS `distance` 
FROM `memb_geo_locations` 
ORDER BY `distance` ASC 

形成內加入你這樣做,你平時將。

SELECT ... 
FROM memb_geo_locations 
INNER JOIN other_table 
ON memb_geo_locations.member_id = other_table.member_id 
ORDER BY `distance` ASC