PHP 按距离分页排序问题

2017-08-28 09:00:34 +08:00
 xiaozy

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

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

如下:

第一页内容

列表 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 进行排序,可只有第一页可以正常排序,而第二页就乱了。

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

3507 次点击
所在节点    问与答
13 条回复
815lbh
2017-08-28 09:15:37 +08:00
能不能把你的语句大概发出来看看。
xiaozy
2017-08-28 09:54:02 +08:00
@815lbh 感谢您的回复,大致就是,先用 select 查询数据表最后 limit 0,5,获取经纬度,纬度,经度...新键个空数组准备存放商家 ID,然后开始 while 循环数据,使用 getmapDistance 函数计算当前和商家经度的距离,把新键的空数组存放商家 ID 并等于距离,使距离变成主键,商家 ID 变成键值,再用距离主键进行 ksort 排序。查询语句太多了,大致就是我说的这些。。。说得有些乱,希望您能看懂。
b821025551b
2017-08-28 10:03:25 +08:00
计算距离直接在数据库里做不就好了,然后直接 order by distance。
Light3
2017-08-28 10:19:42 +08:00
我不知道你怎么存的..距离这种我没做过 我觉得如果 经纬度 各一列 已完全可以 between 给出一个经纬度的范围 然后再排序
xiaozy
2017-08-28 10:24:27 +08:00
@b821025551b 感谢回复,距离是通过查询后获取字段名 map"经度,纬度"后再获取当前位置计算出来的,不知道如何从数据库里做,还望指教,T-T,谢谢!~
815lbh
2017-08-28 10:24:28 +08:00
@xiaozy
select 查询数据表最后 limit 0,5 ?这里是做什么,查询前 5 条吗?
那你取出来的数据不是已经固定了吗?在进行排序不是也就只对前 5 条进行重新排序吗?
xiaozy
2017-08-28 10:26:17 +08:00
@Light3 感谢回复,经度纬度是字段名 map 里的,我只能通过查询取到"经度,纬度"进行处理。。。
815lbh
2017-08-28 10:26:21 +08:00
@xiaozy
逻辑不对啊。不在数据库里面进行距离计算,然后排序,分页,那么就把数据全部取出来,在排序,在分页。
xiaozy
2017-08-28 10:29:43 +08:00
@815lbh 是啊,现在就不知道如何在数据库里,进行坐标计算算出距离,再用距离排序后再分页...
b821025551b
2017-08-28 10:37:24 +08:00
cain
2017-08-28 11:15:15 +08:00
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
2017-08-28 14:44:13 +08:00
geohash 应该可以解决你的问题
MyDaLin
2018-02-03 10:25:30 +08:00
我收集了挺多分页实例的,有兴趣的朋友可以看看
http://www.sucaihuo.com/php/191-0-0-0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/386240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX