1

緯度/経度ポイントのDBがあります。DISTINCTの丸められた結果を距離でソートして取得しようとしています。私の質問は次のとおりです。

SELECT
   DISTINCT ROUND(`lat`,2), ROUND(`lon`,2),
   ( 3959 * acos( cos( radians(LAT_HERE) )
          * cos( radians( `lat` ) )
          * cos( radians( `lon` ) - radians(LONG_HERE) )
          + sin( radians(LAT_HERE) )
          * sin( radians( `lat` ) ) ) ) AS distance
FROM `user_data`
HAVING distance <= 99
ORDER BY distance
LIMIT 100

明確なものはラウンドの前に実行されています。たとえば、(29.333,29.334)、(29.331,29.332)は2回表示されます。

4

2 に答える 2

1

使ってみてくださいGROUP BY

    SELECT  ROUND(`lat`,2), ROUND(`lon`,2),
                   ( 3959 * acos( cos( radians(LAT_HERE) )
                   * cos( radians( `lat` ) )
                   * cos( radians( `lon` ) - radians(LONG_HERE) )
                   + sin( radians(LAT_HERE) )
                   * sin( radians( `lat` ) ) ) ) AS distance
                FROM `user_data`
                GROUP BY ROUND(`lat`,2) 
                HAVING distance <= 99
                ORDER BY distance
                LIMIT 100
于 2013-03-11T19:30:01.187 に答える
0

実際、あなたは正しくありません。DISTINCTは、以前に評価された結果に対して実行されます。たとえば、次のように実行します。

select distinct round(a,2), round(b,2) 
from ((select 29.333 as a,29.334 as b) union (select 29.331,29.332)) t3;

結果は次のとおりです。

+------------+------------+
| round(a,2) | round(b,2) |
+------------+------------+
|      29.33 |      29.33 |
+------------+------------+
于 2013-03-11T19:25:31.150 に答える