帮忙看看这个表应该怎么设计

ivan_070 2015-02-25 11:53:23
需要记录每个用户的得分,然后在页面上显示当前这个用户在排行榜中第几名,按照得分由大到小排名,每个用户的得分是动态的,可能随时会增加。
主要字段:
name:用户名
score:得分

请问怎么能高效的查询出用户的排名
...全文
185 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hefengscu 2015-03-06
  • 打赏
  • 举报
回复
如果楼主的用户量很大,而且用户同时在更新自己的积分数量,在高并发的情况下进行数据库查询效率将会极低。优化sql语句可能不能解决根本原因。可尝试在数据库前端架设缓存,在缓存中计算排名。下面这个帖子讨论了排名计算的算法。可参考。 http://www.cnblogs.com/weidagang2046/archive/2012/03/01/massive-user-ranking.html
ivan_070 2015-03-06
  • 打赏
  • 举报
回复
引用 8 楼 JenMinZhang 的回复:
[quote=引用 4 楼 ivan_070 的回复:] [quote=引用 3 楼 ACMAIN_CHM 的回复:] 参考下贴中的多种方法 http://blog.csdn.net/acmain_chm/article/details/4126306 [征集]分组取最大N条记录方法征集,及散分...
我不需要分组,而且是查询某个用户的所在的排名。 例如 +----+------+ | name |score| +----+ | aaa | 95 | | bbb | 94 | | ccc | 93 | | ddd | 92 | | eee | 91 | +----+------+ 我想要查询ccc是排在第几位的[/quote] 每个用户在表中对应多少条记录 ? 如果表名为 : user_score 表结构为: us_id int(11) ,u_name ,u_score (1)用户与记录关系 一对一 : 直接按照 u_score 倒序排序即可 一对多 :多条需要使用 group by 分组并对 某个用户的分数就和 ,之后在倒序排序 (2)在查询结果中顺便添加个 序列 (名次) select (@i:=@i+1) as i,table_name.* from table_name,(select @i:=0) as it 如果想要限制前几名 可以使用 top 关键字实现 ...... 希望对你有帮助 ![/quote] 用户和记录是一对一,我只想取某个用户排在第几名。
ivan_070 2015-03-06
  • 打赏
  • 举报
回复
引用 7 楼 ACMAIN_CHM 的回复:
引用 1 楼 ivan_070 的回复:
不要 select count(*) from xxx where score>?
楼主为何会认为这个不高效?
数据量稍微有点多,虽然score有索引,但是count需要去遍历,而且我们有一个抢的活动,到一定时间点,并发的访问量非常大。
知道就是你 2015-02-28
  • 打赏
  • 举报
回复
引用 4 楼 ivan_070 的回复:
[quote=引用 3 楼 ACMAIN_CHM 的回复:] 参考下贴中的多种方法 http://blog.csdn.net/acmain_chm/article/details/4126306 [征集]分组取最大N条记录方法征集,及散分...
我不需要分组,而且是查询某个用户的所在的排名。 例如 +----+------+ | name |score| +----+ | aaa | 95 | | bbb | 94 | | ccc | 93 | | ddd | 92 | | eee | 91 | +----+------+ 我想要查询ccc是排在第几位的[/quote] 每个用户在表中对应多少条记录 ? 如果表名为 : user_score 表结构为: us_id int(11) ,u_name ,u_score (1)用户与记录关系 一对一 : 直接按照 u_score 倒序排序即可 一对多 :多条需要使用 group by 分组并对 某个用户的分数就和 ,之后在倒序排序 (2)在查询结果中顺便添加个 序列 (名次) select (@i:=@i+1) as i,table_name.* from table_name,(select @i:=0) as it 如果想要限制前几名 可以使用 top 关键字实现 ...... 希望对你有帮助 !
ACMAIN_CHM 2015-02-28
  • 打赏
  • 举报
回复
引用 1 楼 ivan_070 的回复:
不要 select count(*) from xxx where score>?
楼主为何会认为这个不高效?
ivan_070 2015-02-28
  • 打赏
  • 举报
回复
自己顶起来。求高手给个思路
ivan_070 2015-02-25
  • 打赏
  • 举报
回复
不要 select count(*) from xxx where score>?
ivan_070 2015-02-25
  • 打赏
  • 举报
回复
引用 2 楼 A9925 的回复:
order by 1 使用mysql_fetch_array()从结果集取出数组 2 循环输出 用到程序多一些
能不能讲清楚的点,我只需要知道某个用户排在第几位,需要一种效率高的办法,程序或者数据库表可以设计的复杂一些
ivan_070 2015-02-25
  • 打赏
  • 举报
回复
引用 3 楼 ACMAIN_CHM 的回复:
参考下贴中的多种方法 http://blog.csdn.net/acmain_chm/article/details/4126306 [征集]分组取最大N条记录方法征集,及散分...
我不需要分组,而且是查询某个用户的所在的排名。 例如 +----+------+ | name |score| +----+ | aaa | 95 | | bbb | 94 | | ccc | 93 | | ddd | 92 | | eee | 91 | +----+------+ 我想要查询ccc是排在第几位的
ACMAIN_CHM 2015-02-25
  • 打赏
  • 举报
回复
参考下贴中的多种方法 http://blog.csdn.net/acmain_chm/article/details/4126306 [征集]分组取最大N条记录方法征集,及散分...
  • 打赏
  • 举报
回复
order by 1 使用mysql_fetch_array()从结果集取出数组 2 循环输出 用到程序多一些

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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