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