【问题标题】:How to make ranking system in php mysql?如何在 php mysql 中制作排名系统?
【发布时间】:2019-12-20 18:17:39
【问题描述】:

我有一个 php 应用程序,它有锻炼表,我在其中存储基于活动的日常用户锻炼数据(例如:跑步、步行、骑自行车)。在月底,我必须创建一个排行榜,以根据最高锻炼点生成排名。

SELECT total_distance, user_id,date_created 
   FROM workouts 
   WHERE date_created LIKE '%2019-11%' AND activity_type='Run'. 

通过上述查询,我​​得到如下所述的输出

我已经通过在查询中使用 GROUP BY user_id 优化了查询。

SELECT SUM(total_distance) as points, user_id,date_created 
    FROM workouts 
    WHERE date_created LIKE '%2019-11%' AND activity_type='Run' 
    GROUP BY user_id

我希望我的最终输出如第二张图片所示以及作为新列的排名。 如何为此编写查询。我做不到..

【问题讨论】:

  • 大概,LIKE '2019-11%' 也可以工作,并且具有可以使用索引的优点(尽管范围查询会更快)

标签: php mysql


【解决方案1】:
   SELECT 
   CASE WHEN @l=points THEN @rank ELSE @rank:=@rank+1 END as rank,@l:=points ,points,user_id from (select 
   SUM(total_distance) as points, user_id,date_created 
    FROM workouts 
    WHERE date_created LIKE '%2019-07%'  
    GROUP BY user_id order by points desc) a, (SELECT@rank := 0) vars;

这里有 SQL 演示 http://sqlfiddle.com/#!9/0e8634/2

【讨论】:

  • 我通过您的查询得到了正确的输出,但是如果我有两个或三个具有相同点的用户怎么办......它应该给我排名为 1、2、2、2、3 所以在....@sel
  • 这种情况下,需要比较点。我做了修改。
  • 我添加了一个 IF 语句以在分数不同时增加排名。否则使用相同的排名。
  • 我的总分是 150, 150, 30,20,排名是 1,2,3,4。但我想排名为 1,1,2,3
【解决方案2】:

我会改变这个条件

date_created LIKE '%2019-11%'

进入

month(date_created) = '11' and year(date_created) = '2019'

最终查询,按点 desc 对行进行排序,并使用row_numbers()danse_rank() 创建排名。

函数row_numbers()danse_rank()是从MySQL version >= 8MariaDB >= 10.2.0.开始引入的

对于较新的版本(MySQL version >= 8MariaDB >= 10.2.0.

    SELECT SUM(total_distance) as points, user_id, date_created, 
    ROW_NUMBER() OVER (ORDER BY points desc) as rank

    FROM workouts 

    WHERE month(date_created) = '11' AND year(date_created) = '2019' AND activity_type='Run' 
    GROUP BY user_id
    ORDER BY points desc

对于旧版本(MySQL version < 8MariaDB < 10.2.0.

这也适用于(MySQL version >= 8 OR MariaDB >= 10.2.0.

    SET @rank=0;
    SELECT SUM(total_distance) as points, user_id, date_created, 
    @rank:=@rank+1 as rank

    FROM workouts 

    WHERE month(date_created) = '11' AND year(date_created) = '2019' AND activity_type='Run' 
    GROUP BY user_id
    ORDER BY points desc

【讨论】:

  • @DineshVishwakarma 你能在这里复制那个错误吗?告诉我你用的是哪个版本的mysql?
  • 您的 SQL 语法有误;检查与您的 MYSQL 服务器版本相对应的版本手册,以获得在 '(ORDER BY points desc) AS rank FROM trainings WHERE month(date_created)='11' 附近的用户的正确语法。
  • @DineshVishwakarma 可能是mysql版本的问题,我会更新我的答案
  • 这简直是个坏主意。
  • @Strawberry 你能告诉我吗?
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多