选择唯一记录
我正在寻找附近的地点的地理/空间搜索。我有这样的半正矢查询正在运行对一个表:选择唯一记录
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来过滤重复项,但我不确定是否可以在同一个查询中完成所有操作,或者如果我必须对结果进行一些后处理。
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
宾果,做到了。我在最后或者在ORDER BY之前放置了GROUP BY子句,显然这是失败的。非常感谢! – KirAsh4 2010-11-01 19:07:22
SELECT DISTINCT colum_name FROM table
SELECT关键字使我们能够从表格的一列(或多列)中获取所有信息。这当然意味着会有裁员。如果我们只想选择每个DISTINCT元素呢?这在SQL中很容易完成。我们所需要做的就是在SELECT之后添加DISTINCT。语法如下:
虽然这是一个单列。我仍然需要返回所有四列,并有唯一的记录。 – KirAsh4 2010-11-01 08:48:12
我还需要所有四列返回
你已经了有独特的数据(例如UID 576个575的回报相同的坐标 - 但UID显然不同)。
您对'unique'的定义显然与我们的定义不同 - 您能提供一个您期望看到的例子吗?
忽略UID。我的意思是独特的adrLat和adrLng。正如你指出的,576和575是相同的坐标,只是不同的UID。我不关心UID,我不想要两个(或更多)具有相同坐标的点。 – KirAsh4 2010-11-01 19:05:46
有没有原因你不使用'SPATIAL'函数(和索引)? – Quassnoi 2010-11-01 21:14:58
是的,当这个项目开始时,我和其他开发者都不知道MySQL的空间支持。编码Haversine公式是一件容易的事。也许下一个项目...... – KirAsh4 2010-11-02 05:31:25