2014-08-29 39 views
0

我有一個表格,其中包含事件和使用MySQL POINT(X,Y) as geocodedLocation的位置,我試圖對這些數據使用半徑搜索,現在我已經找到了應該在這裏得到的答案 https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql。我以前也看到這一點,顯然這是谷歌的答案使用位置服務PHP MySQL查找範圍內的事件Lat/Lng

我有2個地區應拿起事件

Area 1 = `Array ([0] => 51.524074 [1] => -0.1005592)` 
Area 2 = `Array ([0] => 53.818391 [1] => -1.4714507)` 

我有一些事件

Event 1 `geocodedLocation` = POINT(-1.54907739999999, 53.8007554) 
Event 2 `geocodedLocation` = POINT(-0.100559200000021, 51.524074) 

是的,我知道點是錯誤的方式,但我沒有建立這個,我只需要使用它。

現在,這是我跑

SELECT a.* 
    ,(
     3959 * acos(cos(radians(51.524074)) * cos(radians((
         SELECT Y(`geocodedLocation`) 
         ))) * cos(radians((
         SELECT X(`geocodedLocation`) 
         )) - radians(- 0.1005592)) + sin(radians(51.524074)) * sin(radians((
         SELECT Y(`geocodedLocation`) 
         )))) 
     ) AS distance 
    ,COUNT(*) AS pagedAmount 
FROM Activities a 
HAVING distance < 10 
ORDER BY a.startTime ASC 

正如你可以看到我使用的位置Area 1查詢,事件Event 2是在這個位置只是一個小更準確,但由於某些原因查詢沒有提供結果Event 2

+0

刪除COUNT(*)作爲pagedAmound部分和交換選擇X和選擇Y,因爲你的點值是周圍的其他方式,你是好去!第二個事件將顯示距離大於168時 – Markus 2014-09-01 12:51:20

+0

它被顛倒我使用Y作爲緯度和X長。爲什麼要刪除一個計數工作? – 2014-09-01 15:15:24

回答

0

不知道你想要計算什麼,如果它的事件總量那麼你必須把一個子查詢放到你的select中,但是如果你想計算返回的行數一個類似於

012的php查詢
$row_cnt = mysqli_num_rows($result); 

您還需要包括group by子句,以獲得比時的結果,如果您使用具有更多,在一個查詢計數

SELECT a.* 
    ,(3959 * acos(cos(radians(51.524074)) * cos(radians((
         SELECT Y(`geocodedLocation`) 
         ))) * cos(radians((
         SELECT X(`geocodedLocation`) 
         )) - radians(- 0.1005592)) + sin(radians(51.524074)) * sin(radians((
         SELECT Y(`geocodedLocation`) 
         )))) 
     ) AS distance 
    ,COUNT(*) AS pagedAmount 
FROM Activities a 
GROUP BY distance 
HAVING distance < 200 
ORDER BY a.startTime ASC; 

編輯

一點在MySQL挖透露即點對象將存儲經度和緯度

Point(lon, lat) 

所以原來的命令就像id上面的id給你正確的距離!

+0

我工作的框架總是爲分頁添加計數(*),而不是與剛剛構建在其上的框架混淆。至於那我試過你的方式第一距離是英里關閉,就像我從我當前的位置離英國4976多遠...... – 2014-09-03 16:15:59

+0

對不起,我的X和Y都不好,但我還是在[sqlfiddle](http://sqlfiddle.com/#!2/f000d5/3)中獲取事件2的結果 – Markus 2014-09-04 04:53:13

0

我在我的一個項目中有類似的查詢。修改爲您的具體情況,這應該是它:

SELECT a.*, (3959 * 
      acos(cos(radians(51.524074)) * 
        cos(radians((SELECT Y(`geocodedLocation`)))) * 
        cos(radians((SELECT X(`geocodedLocation`))) - 
         radians(-0.1005592)) + sin(radians(51.524074)) * 
        sin(radians((SELECT Y(`geocodedLocation`)))))) AS distance 
FROM Activities a HAVING distance < 10 ORDER BY a.startTime