我有一个名为的表,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 的回答效果很好,但也许性能不太好。我需要将他的解决方案与大型数据库进行基准测试,以检查响应时间。
我有一个想法(和可能的解决方案)。该解决方案包括添加新的布尔列,该列表示该分数是否是该玩家的最佳分数。这样,当我将新分数添加到数据库中时,我需要检查新分数是否优于该玩家的最佳旧分数,如果是我需要在旧的最佳分数中将标志标记为假,在新分数。这为我提供了一种直接检索每个玩家的最佳分数的方法(简单查询,如SELECT ... FROM .... ORDER BY
)。
------编辑 2 --------
weicap 的回答是最快的解决方案。我不知道为什么,但他的查询比eggyal 的查询快两倍。
------ EDIT 3 -------- 我错了,如果之前缓存了查询,weicap 的查询会更快,如果不是,查询需要十秒或更长时间。相反,weicap 的回答总是需要 300-400 毫秒来处理 80.000 行。