我尝试进行查询以获得给定坐标的最近(按公里 - >半径)用户。 一切正常,但因为我保存了最后10个位置,希望在单个查询中占用每个用户的最后一个位置。
SELECT `id`, `user_id`, (6371 * acos( cos( radians(42.698201) ) * cos( radians(map_lat) ) *
cos( radians(map_lon) - radians(23.318825)) + sin(radians(42.698201)) *
sin(radians(map_lat)) )) as distance, `map_lat`, `map_lon`, `date_added`
FROM (`map_locations`)
WHERE `user_id` != '3'
HAVING `distance` < 1000
ORDER BY `date_added` desc
这会正确地返回所需距离的每一行。
现在我想要GROUP BY
user_id
,例如,如果有2个唯一身份用户 - >获取他们的最后位置date_added
我想要的结果示例:
[0] => stdClass Object
(
[id] => 22
[user_id] => 1
[distance] => 1.4498781932309621
[map_lat] => 42.7028
[map_lon] => 23.3022
[date_added] => 2017-09-07 14:45:21
)
[1] => stdClass Object
(
[id] => 21
[user_id] => 2
[distance] => 912.4120338405637
[map_lat] => 43.4124
[map_lon] => 12.1231
[date_added] => 2017-09-07 14:24:59
)
不幸的是,当我添加Group By
语句给出0结果时,因为得到了每个用户的第一个结果(订购并不能确定)。
我的研究是,如果Group By
能够正确地按date_added
对结果进行分组,那么它会在它之后正常工作
换句话说:如果每个用户的最后位置符合距离标准,则希望将所有唯一身份用户带到最后位置。
答案 0 :(得分:0)
你有没有试过这个......
SELECT distinct `user_id`, `id`,
(6371 * acos( cos( radians(42.698201) ) * cos( radians(map_lat) ) *
cos( radians(map_lon) - radians(23.318825)) + sin(radians(42.698201)) *
sin(radians(map_lat)) )) as distance, `map_lat`, `map_lon`, `date_added`
FROM (`map_locations`)
WHERE `user_id` != '3'
GROUP BY `user_id`
HAVING `distance` < 1000
ORDER BY `date_added` desc
答案 1 :(得分:-2)
我刚刚在Oracle DB中进行了相同的查询,因此您可以毫不费力地在MySQL上进行调整。
我使用一个不同的三角函数,因为我的lat / lon数据存储为&#34; radians&#34;在我的表中坐标。
因此,在执行任何操作之前,您必须检查数据格式和准确性 。
例如,要查找距原点50公里范围内有多少元素[38.1862,15.5564](十进制)= [0.6664,0.2715](在中弧度):
select count(*)
from my_table
where acos(sin(0.6664) * sin(latitude) + cos(0.6664) * cos(latitude) * cos(longitude - (0.2715))) * 6371 < 50