mysql - 选择唯一记录

标签 mysql

我正在进行地理/空间搜索,寻找附近的点。我有一个针对表运行的半正矢查询:

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

关于mysql - 选择唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4067222/

相关文章:

mysql - 如何检查数据库是否包含 Ruby on Rails 中的值?

mysql - 从mysql中的几个子查询中选择数据

php - 每个用户一个数据库(mysql)连接是否足够?

php - sql : Update sql query on the basis of posted values

MySQL DB 在 Ubuntu 中运行,但不在 Windows 中运行

mysql - 如何在MySQL存储过程中使用时间戳

php - 插入不同的表

php - 按列对表格中的数据进行排序

mysql - SQL 左外连接的意外输出

Mysql 按最近事件计数排序