mysql - 用于选择多行但每个 PK 的最大值的 SQL 查询

标签 mysql sql

我知道标题听起来很可怕,但我不知道如何更好地概括它。我很确定以前有人遇到过同样的问题,但我找不到任何东西。关系数据库管理系统: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。

该表表示游戏的高分。每天所有玩家的分数都会插入以下值:name, points, now(),...

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

我只想要每个用户的最新条目,但只针对最高的 X 玩家。所以结果应该是这样的

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

我希望大家明白我的意思。

提前致谢!

最佳答案

我知道你需要先选出得分最高的 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;

关于mysql - 用于选择多行但每个 PK 的最大值的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32782674/

相关文章:

python - 从 mysql 的列中检索数据

mysql - 使用 PowerShell 运行带重音符号 (`) 的 MySQL 命令

MySQL Left Join 未产生预期结果

sql - CTE 与 Group By 返回与基本查询相同的结果

mysql - SQL Between 子句太慢

mysql - AES_ENCRYPT 返回的字符串是否唯一?

mysql - 如何根据另一个表中的值访问表中的行?

mysql - 选择历年发表的作者

php - Adodb,转义引号?

mysql - 将连接数组传递给 laravel 中的查询