【问题标题】:mysql Quiz leaderboard filter by points, time takenmysql Quiz排行榜按点过滤,所用时间
【发布时间】:2015-05-26 22:54:49
【问题描述】:

我有一个测验报告表,其中显示了用户参加的每个测验的报告。我需要从中创建一个排行榜,它显示最高用户的最佳得分,按 points 过滤,然后 耗时

这里是一个 sql fiddle http://sqlfiddle.com/#!2/65fbf0/1的链接

我真的很挣扎,因为我需要为一个用户按两列过滤结果,我的理想结果是

Results for Quiz id 1
---------------------------------------------------------------   
| user_id  |  points  |  time_spend  |  start_dt  |  quiz_id  |
| 1        |  3       | 0.5          | May,15 2015|  1        |
| 2        |  3       | 0.8          | May,15 2015|  1        |
| 3        |  2       | 0.5          | May,15 2015|  1        |

然后对所有测验的单独查询显示上周的结果

Results from all Quizzs
---------------------------------------------------------------   
| user_id  |  points  |  time_spend  |  start_dt  |  quiz_id  |
| 1        |  3       | 0.5          | May,15 2015|  1        |
| 2        |  3       | 0.8          | May,13 2015|  3        |
| 3        |  2       | 0.5          | May,12 2015|  2        |

【问题讨论】:

    标签: mysql sql select sql-order-by grouping


    【解决方案1】:

    您可以像这样对多个列进行排序:

    select *
    from QuizReport
    where quiz_id = 1
    order by points desc, time_spend asc;
    
    select *
    from (
      select *
      from QuizReport
      where start_dt >= subdate(curdate(), 7)
      order by points desc, time_spend asc) a
    group by user_id;
    

    group_by user_id 为每个 user_id 保留第一行。由于内部查询按分数对行进行排序,因此外部查询将为每个用户显示最佳行。

    【讨论】:

    • 这太棒了,但是我如何按用户的最佳分数进行过滤,所以每次测验我只能为每个用户获得一行
    • 查看更新的答案。不过,这个group by 技巧只适用于 mysql。
    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多