V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xiaozy
V2EX  ›  问与答

PHP 按距离分页排序问题

  •  
  •   xiaozy · 2017-08-28 09:00:34 +08:00 · 3667 次点击
    这是一个创建于 2677 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为有分页功能,排序就出了问题了,最多只能排序第一页,翻页后,列表无法继续排序。请问有什么好方法可以解决先排序后翻页呢?

    我是按获取当前位置与数据库经纬度计算后获得距离后,按最近的距离进行由近到远排序的,最多只能排序第一页,第二页是乱的。

    如下:

    第一页内容

    列表 1 距离:1.5km 列表 2 距离: 2.5km ...

    翻页后,第二页内容

    列表 3 距离:5.5km 列表 4 距离:1.2km 列表 5 距离:7.2km 想要实现的效果如下

    第一页内容

    列表 1 距离:1.2km 列表 2 距离:1.5km ...

    翻页后,第二页内容

    列表 3 距离:2.5km 列表 4 距离:5.2km 列表 5 距离:7.2km

    我是通过 MYSQL 查询语句获得商家经纬度,再获取当前位置两者计算出的距离,并把距离当作键,使用 ksort 进行排序,可只有第一页可以正常排序,而第二页就乱了。

    请问,如何在第一页就把所有最近距离排序好,翻页后接着上一页继续排序。请问该怎么做呢?非常感谢!~

    13 条回复    2018-02-03 10:25:30 +08:00
    815lbh
        1
    815lbh  
       2017-08-28 09:15:37 +08:00
    能不能把你的语句大概发出来看看。
    xiaozy
        2
    xiaozy  
    OP
       2017-08-28 09:54:02 +08:00
    @815lbh 感谢您的回复,大致就是,先用 select 查询数据表最后 limit 0,5,获取经纬度,纬度,经度...新键个空数组准备存放商家 ID,然后开始 while 循环数据,使用 getmapDistance 函数计算当前和商家经度的距离,把新键的空数组存放商家 ID 并等于距离,使距离变成主键,商家 ID 变成键值,再用距离主键进行 ksort 排序。查询语句太多了,大致就是我说的这些。。。说得有些乱,希望您能看懂。
    b821025551b
        3
    b821025551b  
       2017-08-28 10:03:25 +08:00
    计算距离直接在数据库里做不就好了,然后直接 order by distance。
    Light3
        4
    Light3  
       2017-08-28 10:19:42 +08:00
    我不知道你怎么存的..距离这种我没做过 我觉得如果 经纬度 各一列 已完全可以 between 给出一个经纬度的范围 然后再排序
    xiaozy
        5
    xiaozy  
    OP
       2017-08-28 10:24:27 +08:00
    @b821025551b 感谢回复,距离是通过查询后获取字段名 map"经度,纬度"后再获取当前位置计算出来的,不知道如何从数据库里做,还望指教,T-T,谢谢!~
    815lbh
        6
    815lbh  
       2017-08-28 10:24:28 +08:00
    @xiaozy
    select 查询数据表最后 limit 0,5 ?这里是做什么,查询前 5 条吗?
    那你取出来的数据不是已经固定了吗?在进行排序不是也就只对前 5 条进行重新排序吗?
    xiaozy
        7
    xiaozy  
    OP
       2017-08-28 10:26:17 +08:00
    @Light3 感谢回复,经度纬度是字段名 map 里的,我只能通过查询取到"经度,纬度"进行处理。。。
    815lbh
        8
    815lbh  
       2017-08-28 10:26:21 +08:00
    @xiaozy
    逻辑不对啊。不在数据库里面进行距离计算,然后排序,分页,那么就把数据全部取出来,在排序,在分页。
    xiaozy
        9
    xiaozy  
    OP
       2017-08-28 10:29:43 +08:00
    @815lbh 是啊,现在就不知道如何在数据库里,进行坐标计算算出距离,再用距离排序后再分页...
    cain
        11
    cain  
       2017-08-28 11:15:15 +08:00   ❤️ 1
    SELECT
    id, lng, lat,
    (st_distance (point (lng, lat), point({dest_lng}, {dest_lat}) ) / 0.0111) AS distance
    FROM
    locations
    HAVING distance < 50
    ORDER BY distance

    类似这样,使用 mysql 内置 geo spatial functions
    Ref: https://dev.mysql.com/doc/refman/5.6/en/spatial-function-reference.html
    qianlv7
        12
    qianlv7  
       2017-08-28 14:44:13 +08:00   ❤️ 1
    geohash 应该可以解决你的问题
    MyDaLin
        13
    MyDaLin  
       2018-02-03 10:25:30 +08:00
    我收集了挺多分页实例的,有兴趣的朋友可以看看
    http://www.sucaihuo.com/php/191-0-0-0
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:20 · PVG 22:20 · LAX 06:20 · JFK 09:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.