一个困扰了很久的关于 MYSQL 排名算法的问题!
迷茫
迷茫 2017-04-17 11:58:09
[MySQL讨论组]

我需要给数据库里的所有成员(大约10万个)按照某个字段(point)做排名,这个排名既要显示在列表页,也要显示在会员详情页。

于是我给每个会员做了一个排名缓存字段 rank

我在前台有一个根据point倒序排列的页面(foreach $rs as $key=>$value),我的做法是在这个页面中判断缓存「rank字段」和「($key+1)+(当前页数-1)*每页显示数量」是否相等,如果不等就更新rank字段。

这个方案解决了列表页面的排名同步到详情页的问题。但是新问题来了。用户的point是变化的

我需要给point发生变化的个体更新他的排名(总不能到列表页去更新吧,尤其是用户排名比较靠后的),于是当用户的point发生变化的时候我又写了一个

SELECT count(1) FROM user WHERE point>='用户当前最新的point值';

并把这个 count(1) 写入到了该用户的rank字段,长久运行之后,总是发现 这个count(1) 和列表计算出的排名有差距,于是成员的排名总是发生浮动。。。体验很不好

而我如果去掉列表页的更新方案,单独采用 SELECT count(1) 的话,又总是出现排名重复的情况(前几名都会有重复)

请问大侠们有没有什么好的解决方案!?

PS:

SELECT count(1) FROM user WHERE point>='用户当前最新的point值';
这段查询语句的效率也非常差,不知道有没有更好的写法

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
PHP中文网

因为是单一字段,可以考虑用redis的sortset结构可以做实时排序。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号