mysql - 如何对该查询进行分组以返回单个结果?

标签 mysql

我有一个无法更改的数据库结构,但我想找到获取此数据的最有效方法。

我们有一个具有 3 个级别的游戏对象,在每个级别结束时,游戏都会将一个分数保存到数据库中,级别分数位于相应的列中,其他级别的列中为 0。如下图所示:

数据库结构:

UserID | Score1| Score2| Score3| CreatedAt
1      |0      |0      |3      |<today>
1      |2      |0      |0      |<today>
1      |0      |5      |0      |<today>
1      |0      |0      |2      |<yesterday>
1      |0      |6      |0      |<yesterday>
1      |1      |0      |0      |<yesterday>
1      |0      |0      |6      |<3 days ago>
1      |0      |7      |0      |<3 days ago>
1      |4      |0      |0      |<3 days ago>

现在,是的,拥有像 UserID | 这样的结构将是一个更好的解决方案。分数 |等级编号 | CreatedAT ,但由于其他一些情况,我们无法更改结构。

所以,我想做的是,进行一个查询,在给定日期的情况下获取三个最新分数。例如,在上面的示例中,查询今天的日期将返回 Score1: 2、Score2: 5、Score3: 3 的结果; 2 天前查询会得到 Score1: 4, Score2: 7, Score3: 6;

最佳答案

这应该可以解决您的问题:

select userid
     , s1
     , s2
     , s3
  from (
            select userid
                 , createdat
                 , sum(score1) s1
                 , sum(score2) s2
                 , sum(score3) s3
              from table
          group by userid
                 , createdat
       ) t
 where t.createdat = (
                        select max(t1.createdat)
                          from table t1
                         where t1.userid = t.userid
                           and t1.createdat <= <date_queried>
                      )
     ;

关于mysql - 如何对该查询进行分组以返回单个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326344/

相关文章:

mysql - Mysql 中删除创建表与截断表

mysql - sqoop 日期到 impala 时间戳

mysql - 连接 3 个表 - MySQL

php - 无法从数据库回显表

MySQL。子查询

javascript - 下载以 base64 编码的文件时,pdf 文件已损坏

mysql - 如何在sql语句中选择where子句未涵盖的行?

php - zend_db 适配器不在/zend_db_expr

mysql - 在 Workbench 6.3 中创建新连接时,我得到 "unknown database"

mysql - 如何根据标签获取相似对象