MySql + PHP Group by,Having和Order By一起使用返回 - 没有结果

时间:2017-09-08 09:02:58

标签: php mysql

我尝试进行查询以获得给定坐标的最近(按公里 - >半径)用户。 一切正常,但因为我保存了最后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对结果进行分组,那么它会在它之后正常工作

换句话说:如果每个用户的最后位置符合距离标准,则希望将所有唯一身份用户带到最后位置。

2 个答案:

答案 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