MySQL查询从表中提取两条信息

Posted

技术标签:

【中文标题】MySQL查询从表中提取两条信息【英文标题】:MySQL query extracting two pieces of information from table 【发布时间】:2014-04-09 19:02:02 【问题描述】:

我有一个表格可以记录玩我游戏的人的得分

userID |  game_level |      date_of_attempt        |  score
   1           1          2014-02-07 19:29:00           2
   1           2          2014-02-08 19:00:00           0
   2           1          2014-03-03 11:11:04           4
  ...         ...                 ...                  ...

我正在尝试编写一个查询,对于给定的用户,它将告诉我他们每个 game_level 的累积分数以及他们在特定 game_level 上获得的最后 20 个分数的平均值(通过排序在date_of_attempt)

例如:

userID | game_level | sum of scores on game level |  average of last 20 level scores
   1         1                      26                              4.5
   1         2                     152                              13

是否可以在单个查询中执行此类操作?我经常需要对多个游戏关卡执行查询,并且我使用长子查询来确定需要哪些关卡,这让我认为单个查询会更好

【问题讨论】:

能否请您发布您迄今为止尝试过的内容(即您提到的这个“长子查询”)? 【参考方案1】:

mysql 不支持分析函数,因此获取平均值比在其他一些 RDBMS 中更棘手。在这里,我使用user-defined variables 获得分组排名,然后对结果进行测试以仅对最近的 20 条记录进行平均:

SELECT   userID, game_level, SUM(score), x.avg
FROM     my_table JOIN (
           SELECT   AVG(CASE WHEN (@rank := (CASE
                      WHEN t.userID     = @userID
                       AND t.game_level = @gamelevel
                      THEN @rank + 1
                      ELSE 0
                    END) < 20 THEN score END)   AS avg,
                    @userID     := userID     AS userID,
                    @game_level := game_level AS game_level
           FROM     my_table,
                    (SELECT @rank := @userID := @game_level := NULL) init
           ORDER BY userID, game_level, date_of_attempt DESC
         ) x USING (userID, game_level)
GROUP BY userID, game_level

更多信息请参见How to select the first/least/max row per group in SQL。

【讨论】:

以上是关于MySQL查询从表中提取两条信息的主要内容,如果未能解决你的问题,请参考以下文章

MySql 查询从表中找出前 50% 的记录

MySQL - 查询临时表以从表中检索 2 行

如何从表中获取所有数据,包括表 ID

如何使用 MySQL 查询从表中选择除一列之外的所有内容? [复制]

mysql 根据数据所在的表从表中选择

我想在mysql数据库中查询news表中的信息按type类型去查询同时还要分页,这个怎么