【问题标题】:PHP MySQL ranking systemPHP MySQL排名系统
【发布时间】:2014-11-25 20:48:06
【问题描述】:

我最近正在使用Riot Games API,并且需要帮助或示例来说明如何实现这一点。我在 mysql 中有一个名为“summoners”的数据库,表中的每个召唤者如下所示:

有 6 个等级(从坏到好):青铜

我想要实现的是将它们排列在一起(等级、分区和联赛积分)并输出如下所示的等级数:

123311:排名#1

234453422:排名#2

123123:排名#3

234234234:排名#4

不知道怎么做,在数据库中选择很多数据会在服务器上很难吗?

【问题讨论】:

  • 我会制作一个带有层权重的表格,然后按它加入并按重量排序

标签: php mysql sql


【解决方案1】:
ORDER BY 
  FIND_IN_SET(tier,'CHALLENGER,DIAMOND,...'),
  FIND_IN_SET(division,'V,IV,III,II,I'),
  leaguepoints DESC;

但是,它的性能对你来说还不够,你可以开始 using ENUM's and sort on those (mysql documentation)

如果您需要直接在查询输出中排名(尽管您也可以在应用程序代码中运行计数器),look at this question

【讨论】:

  • 谢谢,我怎样才能只检索其中的 1 个结果?我的做法是循环您上面给出的内容并获取结果索引,但如果表有超过 10,000 列,这不是一个好主意。不过再次感谢!
  • s/columns/rows/ 我想。好吧:坦率地说,我不会在大集合中即时计算它,我会添加一个排名列,我会让一个 cronjob 运行一次 X 次,或者,如果你完全控制表何时更新并且它是合理分开,在更新时运行排名。您可以将行号答案与排序答案结合起来,然后运行UPDATE table SET rank=@row := @row + 1 ORDER BY ....
  • 我尝试更新您在上面向我展示的方式,但排名字段在所有列上设置为 0,我的代码是:UPDATE stats SET rank = @row := @row + 1 ORDER BY FIND_IN_SET(tier,"CHALLENGER,DIAMOND,PLATINUM,GOLD,SILVER,BRONZE"), FIND_IN_SET(division,"V,IV,III,II,I"), leaguePoints DESC 还应该指出我确实在没有 @row 的情况下对其进行了测试: = @row + 1 并将 25 放在那里,效果很好。
  • 没关系通过将变量 row 设置为 0 SET @row = 0 来让它工作。感谢您的帮助,我会接受这个答案!
猜你喜欢
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2011-03-31
  • 2013-05-19
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多