SQL - 使用DISTINCT查找附近的地方? (Maps API)

时间:2017-02-27 04:39:09

标签: mysql sql maps

我在MYSQL中有一个单独的表,其中包含位置信息(纬度和经度)的用户地址,每个用户可以拥有多个注册地址。我的目标是,当您搜索某个位置时,会列出距离该位置最近的所有用户。

问题是我无法进行DISTINCT,因此每个用户在SELECT中只列出一次。我搜索得更深,看到GROUP BY可以解决问题。它确实通过防止重复来对用户进行分组,但是它不能保持最短距离的正确顺序。

这种情况可以在地图文档中轻松查看,但DISTINCT尚未完成。

没有GROUP BY的结果:

ID_PLACE | ID_USER | NAME_USER | DISTANCE
   2         1        MARIA         5
   3         2        KEVIN         6
   1         1        MARIA         8
   4         2        KEVIN         10

GROUP BY的结果:

ID_PLACE | ID_USER | NAME_USER | DISTANCE
    1         1        MARIA         8
    3         2        KEVIN         6

应该什么时候......

ID_PLACE | ID_USER | NAME_USER | DISTANCE
   2         1        MARIA         5
   3         2        KEVIN         6

使用GROUP BY,按距离排序似乎被忽略,显然是由PLACE_ID完成的。

我的选择是:

SELECT id, user_id,
    (6371 *
     Cos (radians (-30.053831))
     * Cos (radians (lat))
     * Cos (radians (lng) -radians (-51.191810))
     + Sin (radians (-30.053831))
     * Sin (radians (lat))
     )
    ) AS distance
    FROM places
    GROUP BY user_id
    HAVING distance < 25
    ORDER BY distance ASC;

1 个答案:

答案 0 :(得分:0)

尝试以下查询:

SELECT id,
       user_id,
       (6371 * Cos (radians (-30.053831)) * Cos (radians (lat)) * Cos (radians (lng) -radians (-51.191810)) + Sin (radians (-30.053831)) * Sin (radians (lat)) ) ) AS distance
FROM places
GROUP BY user_id
HAVING distance < 25
ORDER BY (6371 * Cos (radians (-30.053831)) * Cos (radians (lat)) * Cos (radians (lng) -radians (-51.191810)) + Sin (radians (-30.053831)) * Sin (radians (lat)) ) ASC;