我有一个名为 Scores
的表,其中包含列:id
、player_id
、value1
、 value2
、value3
和 date
。
该表有以下内容:
+------+-----------+--------+--------+--------+------------+
| id | player_id | value1 | value2 | value3 | date |
+------+-----------+--------+--------+--------+------------+
| 1 | 1 | 10 | 0 | 0 | 2012-08-02 |
+------+-----------+--------+--------+--------+------------+
| 2 | 2 | 15 | 1 | 0 | 2012-08-03 |
+------+-----------+--------+--------+--------+------------+
| 3 | 3 | 9 | 0 | 0 | 2012-08-04 |
+------+-----------+--------+--------+--------+------------+
| 4 | 1 | 11 | 0 | 0 | 2012-08-05 |
+------+-----------+--------+--------+--------+------------+
| 5 | 2 | 16 | 2 | 0 | 2012-08-06 |
+------+-----------+--------+--------+--------+------------+
| 6 | 2 | 15 | 0 | 0 | 2012-08-07 |
+------+-----------+--------+--------+--------+------------+
我正在尝试获取一个查询,该查询返回按“value1、value2、value3”中的值排序的每个玩家的最佳高分。 value1 是重要性较高的字段,value2 是中等重要性,value3 是次要重要性,示例:
value1 = 15 value1 = 15
value2 = 1 is greater than -> value2 = 0
value3 = 0 value3 = 1
我需要的查询的预期结果是:
+------+-----------+--------+--------+--------+------------+
| id | player_id | value1 | value2 | value3 | date |
+------+-----------+--------+--------+--------+------------+
| 5 | 2 | 16 | 2 | 0 | 2012-08-06 |
+------+-----------+--------+--------+--------+------------+
| 4 | 1 | 11 | 0 | 0 | 2012-08-05 |
+------+-----------+--------+--------+--------+------------+
| 3 | 3 | 9 | 0 | 0 | 2012-08-04 |
+------+-----------+--------+--------+--------+------------+
我正在尝试使用 MAX、DISTINCT、GROUP BY 和子查询,但我没有得到正确的结果。基本上它是下一个查询,但选择每个“组”的第一行:
SELECT id, player_id, value1, value2, value3
FROM scores
ORDER BY value1 DESC, value2 DESC, value3 DESC
------编辑 1--------
eggyal 的回答 工作正常,但也许性能不太好。我需要针对大型数据库对他的解决方案进行基准测试,以检查响应时间。
我有一个想法(和可能的解决方案)。解决方案包括添加新的 bool 列,它表示该得分是否是该玩家的最佳得分。这样,当我将新分数添加到 DB 中时,我需要检查新分数是否优于该玩家的最佳旧分数,如果是,我需要在旧的最佳分数中将标志标记为 false,在新分数。这为我提供了一种直接检索每个玩家的最佳分数的方法(像 SELECT ... FROM .... ORDER BY
这样的简单查询)。
------编辑 2--------
weicap 的答案 是最快的解决方案。我不知道为什么,但他的查询速度比 eggyal 的查询速度快两倍。
------编辑 3------ 我错了,如果之前缓存了查询,weicap 的查询会更快,否则查询需要十秒或更长时间。在变化中,weicap 的答案总是需要 300-400 毫秒来处理 80.000 行。
最佳答案
对于每个值
,您可以获得groupwise maximum :
SELECT * FROM Scores NATURAL JOIN (
SELECT player_id, value1, value2, MAX(value3) value3 FROM Scores NATURAL JOIN (
SELECT player_id, value1, MAX(value2) value2 FROM Scores NATURAL JOIN (
SELECT player_id, MAX(value1) value1 FROM Scores
GROUP BY player_id) t
GROUP BY player_id) t
GROUP BY player_id) t
ORDER BY value1 DESC, value2 DESC, value3 DESC
查看 sqlfiddle .
关于mysql - 选择每个玩家的最佳分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12106613/