【问题标题】:MySql + PHP Group by, Having and Order By used together returns - no resultsMySql + PHP Group by,Having 和 Order By 一起使用返回 - 没有结果
【发布时间】:2017-09-08 17:20:08
【问题描述】:

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

换句话说:如果每个用户的最后位置与距离标准匹配,则想要获取所有唯一用户及其最后位置。

【问题讨论】:

  • Group by 可以工作,但我认为由于时间戳而无法工作。他们改变的秒数并不一致。您是否尝试在不带时间戳的情况下对它们进行分组。

标签: php mysql


【解决方案1】:

你有没有这样尝试过……

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

【讨论】:

    【解决方案2】:

    我刚刚在 Oracle DB 中进行了相同的查询,因此您可以在 MySQL 上轻松调整它。

    我使用了不同的三角函数,因为我的纬度/经度数据在我的表格中存储为“弧度”坐标

    所以你必须在做任何事情之前检查你的数据格式和准确性

    例如,要查找距原点 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
    

    【讨论】:

    • 这绝对不能回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2015-05-05
    • 2014-01-30
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多