mysql - 选择每个玩家的最佳分数

标签 mysql select group-by max sql-order-by

我有一个名为 Scores 的表,其中包含列:idplayer_idvalue1 value2value3date

该表有以下内容:

+------+-----------+--------+--------+--------+------------+
|  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 |
+------+-----------+--------+--------+--------+------------+

我正在尝试使用 MAXDISTINCTGROUP 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/

相关文章:

php - 使用多个 php 文件更新数据库时出错

java.lang.NoClassDefFoundError : org/hibernate/criterion/Criterion 错误

mysql - 是否可以在 mysql 中实现 2 个逗号分隔列表(通过 group_concat 获得)之间的包含检查?

flutter - 如何在另一个组列表(groupby)中实现组列表。是否可以在dart自定义对象中使用多个哈希码和operator ==

sql - 在 SQL 中使用窗口函数对空记录进行分组

mysql - 适合大表的良好数据库,具有简单的键访问

sql-server - SQL Server 查询 - 如何将选定的值插入到另一个表中

javascript - 数据表通过按键选择扩展/导航

python - Double Group-by 然后应用一些功能?

mysql - 我如何对多列进行数据追加