我在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;
答案 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;