如何计算积分排名?

fxs_2008 2009-09-19 03:53:13
正在开发积分系统!其中有一项数据是显示用户积分排名?
一下子想不到太好的办法!

最简的情况是统一某一字段的积分数据排名?比如积分字段,里面存的整数!

如何排名?或者说如何获得他在排序中的序列位次呢?

还有没有其他的排名计算办法或机制呢?

做过这方面的朋友给指点下?

...全文
597 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
AppleII 2012-04-16
  • 打赏
  • 举报
回复
一般来说大数据量的排名都是定期计算,就像alexa网站排名,都是多少时间计算一次。相关的SQL语句可以参考: http://club.okbase.net/task/item/160
fxs_2008 2012-03-15
  • 打赏
  • 举报
回复
不好意思,忘了结贴!
fxs_2008 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zalvsa 的回复:]
1、要么在需要显示积分排名的时候,重新计算积分排名
数据库设计好的话,直接order by 积分应该就知道排名情况了;
2、要么你在UPDATE积分的时候就计算排名;
3、要么定时后台计算积分排名;

[/Quote]

第一种我是先排序,然后查前面有多少个来计算,不知还有没有其他好办法
第2,3种如何操作?
zalvsa 2009-09-24
  • 打赏
  • 举报
回复
如果实时性要求不高的话,可以在读取积分排名的时候,order by 积分;

如果有设置字段积分排名的话,可以选择2,3,要不要设置这个字段,主要还是看你对系统的要求,比如积分名次需要经常被查询并应用于其他地方的查询等。
zalvsa 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 fxs_2008 的回复:]
引用 11 楼 xuzuning 的回复:
使用“用户变量”
set @xh=0
select @xh:=@xh+1 as 排名, sum(积分字段) from 表 group by 用户 order by 用户


老大,这个什么意思

如果我想定时更新所有用户的排名序:PHP或mysql有什么简洁的办法?
[/Quote]

1、要么在需要显示积分排名的时候,重新计算积分排名
数据库设计好的话,直接order by 积分应该就知道排名情况了;
2、要么你在UPDATE积分的时候就计算排名;
3、要么定时后台计算积分排名;
ljsnake 2009-09-23
  • 打赏
  • 举报
回复
查询时对分数排序吧,再提取名次
fxs_2008 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zqufeifei 的回复:]
那样的话数据就只能用链表存储吧~~
[/Quote]
什么意思?
yutao_7871 2009-09-21
  • 打赏
  • 举报
回复
顶起来
zqufeifei 2009-09-21
  • 打赏
  • 举报
回复
那样的话数据就只能用链表存储吧~~
fxs_2008 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xuzuning 的回复:]
使用“用户变量”
set @xh=0
select @xh:=@xh+1 as 排名, sum(积分字段) from 表 group by 用户 order by 用户
[/Quote]

老大,这个什么意思

如果我想定时更新所有用户的排名序:PHP或mysql有什么简洁的办法?
fxs_2008 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hzcenter 的回复:]
那个只是简单的排序。算第几也不难

select count(*) + 1 from `table` where rank > (select rank from `table` where id = *)


[/Quote]
我也是这么做的
fen115573167 2009-09-21
  • 打赏
  • 举报
回复
排序一下,最大的为第一,依次往后推就可以了,如果说用户查看自己的排名时这样做还是不行的
dehexiao 2009-09-21
  • 打赏
  • 举报
回复
楼主的意思是不是:除了用数据表记录“积分”字段,用来排序,还有其它方法没?是吧!
xuzuning 2009-09-21
  • 打赏
  • 举报
回复
使用“用户变量”
set @xh=0
select @xh:=@xh+1 as 排名, sum(积分字段) from 表 group by 用户 order by 用户
CYBEREXP2008 2009-09-21
  • 打赏
  • 举报
回复
顶楼上的
hzcenter 2009-09-21
  • 打赏
  • 举报
回复
那个只是简单的排序。算第几也不难

select count(*) + 1 from `table` where rank > (select rank from `table` where id = *)

wangye292 2009-09-21
  • 打赏
  • 举报
回复
顶~
江南昆虫 2009-09-21
  • 打赏
  • 举报
回复
首先用户表中应该有一个“积分总数”字段,如果不需要实时效果的话,可以在用户表中加一个“积分排名”字段,然后编一个每天定时计算排名的存储过程,更新用户名次,就像CSDN现在的技术分排名就是非实时的。

如果要实时,可以

select count(1) from 用户表 where 积分总数>张三的积分数 or (积分总数=张三的积分数 and 用户编号<=张三的用户编号)

这也相当于
order by 积分总数 desc,用户编号 asc

fxs_2008 2009-09-19
  • 打赏
  • 举报
回复
简如现在有积分字段
现在添加一个字段,保存排名信息
如保用PHP或SQL自动将生成排名信息?

如果没有排名字段,给一个用户uid,如何获得排名?
dahaidao 2009-09-19
  • 打赏
  • 举报
回复
积分应该是分开记在每一项里,并把总分汇总记到楼主说的最简单情况.
可以按每项单独统计,也可以统计总分的情况.
这样比较好.
加载更多回复(3)

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧