用于为每个PK选择多行但值最高的SQL查询

时间:2015-09-25 12:52:51

标签: mysql sql

我知道标题听起来很糟糕,但我不知道如何更好地总结它。我很确定有人之前遇到过同样的问题,但我找不到任何东西。 RDBMS:MySQL。

问题: 我有以下(简化)表:

+------+------------+---------------------------------+
| name | date       | score                           |
+------+------------+---------------------------------+
| A    | 01.01.2015 | 1                               |
| A    | 01.02.2015 | 3                               |
| A    | 01.03.2015 | 4                               |
| B    | 01.01.2015 | 3                               |
| B    | 01.02.2015 | 4                               |
| B    | 01.03.2015 | 5                               |
| C    | 01.01.2015 | 1                               |
| C    | 01.02.2015 | 2                               |
| C    | 01.03.2015 | 3                               |
+------+------------+---------------------------------+

没有唯一约束或PK定义。

该表代表了游戏的高分。每天都会插入所有玩家的分数,其值包括:名称,分数,现在(),...

数据代表每个玩家在特定时间得分的快照。

我想要每个用户的最新条目,但仅限于最高X玩家。所以结果看起来应该是

+------+------------+---------------------------------+
| name | date       | score                           |
+------+------------+---------------------------------+
| A    | 01.03.2015 | 4                               |
| B    | 01.03.2015 | 5                               |
+------+------------+---------------------------------+
  • C没有出现,因为他不在前2名(按分数)
  • A出现最近一行(按日期)
  • B出现,像A一样,最近一行(按日期),因为他在前2位

我希望我的意思变得清晰。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我知道你需要的是首先选择获得最高分的X球员,然后获得最新的表现。在这种情况下,您应该这样做:

SELECT * 
FROM tablename t
JOIN
(
  SELECT t.name, max(t.date) as max_date
  FROM tablename t
  JOIN
  (
    SELECT name 
    FROM
    (
      SELECT name, max(score) as max_score
      FROM table_name
      GROUP BY name
    ) all_highscores
    ORDER BY max_score DESC
    LIMIT X
  ) top_scores
  ON top_scores.name = t.name
  GROUP BY t.name
) top_last
on t.name = top_last.name
and t.date = top_last.date;