2010-11-01 102 views
2

我正在尋找附近的地點的地理/空間搜索。我有這樣的半正矢查詢正在運行對一個表:選擇唯一記錄

SELECT 
uid, adrLat, adrLng, 
round(3956 * 2 * ASIN(SQRT(POWER(SIN((39.97780609 - abs(adrLat)) * pi()/180/2), 2) + COS(39.97780609 * pi()/180) * COS(abs(adrLat) * pi()/180) * POWER(SIN((-105.25861359 - adrLng) * pi()/180/2), 2))), 2) AS distance 
FROM dataPoints 
WHERE adrLng BETWEEN -105.2680699902 AND -105.2491571898 
AND adrLat BETWEEN 39.970559713188 AND 39.985052466812 
HAVING distance <= 0.30 and distance > 0.00 
ORDER BY distance; 

這給我一個結果,就像這樣:

+-----+-------------+---------------+----------+ 
| uid | adrLat  | adrLng  | distance | 
+-----+-------------+---------------+----------+ 
| 191 | 39.97764587 | -105.25627136 |  0.12 | 
| 520 | 39.97746658 | -105.25627136 |  0.13 | 
| 265 | 39.97560120 | -105.25814056 |  0.15 | 
| 266 | 39.97560120 | -105.25814056 |  0.15 | 
| 274 | 39.97710037 | -105.25589752 |  0.15 | 
| 98 | 39.97764969 | -105.26172638 |  0.17 | 
| 576 | 39.97967911 | -105.25613403 |  0.18 | 
| 575 | 39.97967911 | -105.25613403 |  0.18 | 
| 469 | 39.97895813 | -105.25386810 |  0.26 | 
| 470 | 39.97895813 | -105.25386810 |  0.26 | 
| 1 | 39.98003006 | -105.25471497 |  0.26 | 
| 383 | 39.97621155 | -105.26350403 |  0.28 | 
| 431 | 39.97459793 | -105.25507355 |  0.29 | 
| 430 | 39.97459793 | -105.25507355 |  0.29 | 
| 429 | 39.97459793 | -105.25507355 |  0.29 | 
| 428 | 39.97459793 | -105.25507355 |  0.29 | 
+-----+-------------+---------------+----------+ 

然而,正如你可能會說,一些記錄在表中複製(這是數據提供給我的方式,我必須這樣保留它。)265:266,576:575,469:470和431-428都是重複的。

有沒有辦法修改查詢來選擇唯一記錄?它看起來像我必須匹配adrLat和adrLng來過濾重複項,但我不確定是否可以在同一個查詢中完成所有操作,或者如果我必須對結果進行一些後處理。

+0

有沒有原因你不使用'SPATIAL'函數(和索引)? – Quassnoi 2010-11-01 21:14:58

+0

是的,當這個項目開始時,我和其他開發者都不知道MySQL的空間支持。編碼Haversine公式是一件容易的事。也許下一個項目...... – KirAsh4 2010-11-02 05:31:25

回答

3
SELECT adrLat, adrLng, 
     round(3956 * 2 * ASIN(SQRT(POWER(SIN((39.97780609 - abs(adrLat)) * pi()/180/2), 2) + COS(39.97780609 * pi()/180) * COS(abs(adrLat) * pi()/180) * POWER(SIN((-105.25861359 - adrLng) * pi()/180/2), 2))), 2) AS distance 
FROM mytable 
WHERE adrLng BETWEEN -105.2680699902 AND -105.2491571898 
     AND adrLat BETWEEN 39.970559713188 AND 39.985052466812 
GROUP BY 
     adrLat, adrLng 
HAVING distance <= 0.30 
     AND distance > 0.00 
ORDER BY 
     distance 
+0

賓果,做到了。我在最後或者在ORDER BY之前放置了GROUP BY子句,顯然這是失敗的。非常感謝! – KirAsh4 2010-11-01 19:07:22

3
SELECT DISTINCT colum_name FROM table 

SELECT關鍵字使我們能夠從表格的一列(或多列)中獲取所有信息。這當然意味着會有裁員。如果我們只想選擇每個DISTINCT元素呢?這在SQL中很容易完成。我們所需要做的就是在SELECT之後添加DISTINCT。語法如下:

+0

雖然這是一個單列。我仍然需要返回所有四列,並有唯一的記錄。 – KirAsh4 2010-11-01 08:48:12

0

我還需要所有四列返回

你已經有獨特的數據(例如UID 576個575的回報相同的座標 - 但UID顯然不同)。

您對'unique'的定義顯然與我們的定義不同 - 您能提供一個您期望看到的例子嗎?

+0

忽略UID。我的意思是獨特的adrLat和adrLng。正如你指出的,576和575是相同的座標,只是不同的UID。我不關心UID,我不想要兩個(或更多)具有相同座標的點。 – KirAsh4 2010-11-01 19:05:46