【问题标题】:Select max value from column along with its corresponding date [duplicate]从列中选择最大值及其相应的日期[重复]
【发布时间】:2014-03-07 22:12:43
【问题描述】:

任何人都知道我如何获得与每个 game_id、每个级别的最高分数相对应的日期:

----------------------------------------
|id |game_id |level |score |date       |
----------------------------------------
|1  |0       |1     |90    |1391989720 |
|1  |0       |1     |95    |1391989721 |
|1  |1       |1     |4     |1391989722 |
|1  |1       |1     |8     |1391989723 |
|1  |1       |2     |6     |1391989724 |
----------------------------------------

    SELECT cdu_user_progress.game_id, 
           cdu_user_progress.level, 
           max_score, 
           cdu_user_progress.date 
    FROM 
    (
        SELECT game_id, level, MAX(score) AS max_score
        FROM cdu_user_progress 
        GROUP BY game_id, level 
    ) AS ms 
    JOIN cdu_user_progress ON cdu_user_progress.game_id = ms.game_id AND 
                              cdu_user_progress.level = ms.level AND 
                              cdu_user_progress.score = ms.max_score 

现在,如果我还想获得 FIRST game_id(每个级别)的分数和日期,该怎么办:

-----------------------------------------------------------------
|game_id |level |max_score |max_date   |first_score |first_date |
-----------------------------------------------------------------
|0       |1     |95        |1391989721 |90          |1391989720 |
|1       |1     |8         |1391989723 |4           |1391989722 | 
|1       |2     |6         |1391989724 |6           |1391989724 |
-----------------------------------------------------------------

【问题讨论】:

  • 幸运的是,每个人都会问这个问题。单身的。日。在所以。有时也能正确回答!
  • 到目前为止,您提出了 15 个问题。有没有注意到当你写你的问题时弹出的“相关”列?副本也是从您问题右侧的“相关”列中挑选出来的。

标签: mysql sql groupwise-maximum


【解决方案1】:

因为是mysql,所以你可以简单地这样拉取每局得分最高的整行:

select * from (
  select *
  from cdu_user_progress
  order by score desc) x
group by game_id

这是因为 mysql 的非标准 group by 功能,因此它返回每个组遇到的 first 行,而不是 all 非聚合列在group by 子句。

【讨论】:

  • 这绝对不能保证有效。 MySQL 文档非常明确,当使用允许选择中的非聚合列的 group-by 扩展时,值来自 arbitrary (“indeterminate”)行而不一定来自第一行。文档在这里:dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html.
  • @GordonLinoff 之前听到了这一切……打哈欠。向我展示一个返回第一行以外的任何内容的测试用例。你不能,因为它从不发生。这种技术在 100% 或时间内有效。它会改变的唯一方法是如果 mysql 有重大更新并且他们决定更改此功能的实现,这是不太可能的。除此之外,相信我......你可以依赖这种行为。
  • 。 .如果文档没有明确指出这一点,那么我会有点痛苦地忽略这个问题(我很确定 ANSI 标准说 order by 在子查询中被忽略,除非在一些非常具体的情况下情况)。因此,尽管这在实践中有效,但我认为颁布是非常糟糕的做法。例如,比使用group by 订购东西更糟糕。后者被明确记录在案,并将被弃用。前者被明确记录为无效。
  • @GordonLinoff 我睡得很好:)
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 2020-07-24
  • 2018-10-04
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2020-11-16
相关资源
最近更新 更多