排名 - 选择相应的列值为MAX(列)值

时间:2014-11-08 15:39:53

标签: mysql sql

我有一个包含以下字段的游戏桌: user_id, level, clear_time

有N个级别,表格跟踪用户何时超过某个级别。现在,我需要根据两个约束对用户进行排名:levelclear_time。显而易见,处于较高级别的用户处于领先地位,但当多个用户处于同一级别时,clear_time决定谁领先,即首先清除该级别的用户。以下是我尝试过的,不按照我想要的方式工作。级别排序工作正常,但clear_time搞砸了。

SELECT 
    u.*,
    @rank := @rank + 1 rank
FROM
    ( SELECT
        t1.user_id user_id,
        MAX(t1.level) level,
        t1.clear_time clear_time,
        t2.username username
    FROM 
            gameplay t1
    INNER JOIN
        users t2
    ON
        ( t1.user_id = t2.id )
    GROUP BY
        user_id
    ORDER BY
        level DESC,
        clear_time ASC
    ) u
JOIN
    ( SELECT @rank := 0 ) r

我看到问题是MAX(级别)没有得到相应的clear_time。我做不到。 分析结果,我看到未选择MAX(t1.level)值的相应字段。我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

听起来gameplay每个user_id有多个条目。即:级别x和级别y的条目都具有相同的user_id,并且您希望选择具有最高级别和相应值clear_time的行,但MAX只会选择组中的最高级别,而不会选择同一行中clear_time的值。

您可以使用JOIN上的其他gameplay执行此操作。编辑:这是我设置的一个例子:

MariaDB [test]> select * from gameplay;
+---------+---------------------+-------+
| user_id | clear_time          | level |
+---------+---------------------+-------+
|       1 | 2014-11-08 11:22:25 |     1 |
|       1 | 2014-11-09 11:22:40 |     2 |
+---------+---------------------+-------+
2 rows in set (0.00 sec)

MariaDB [test]> select * from users;
+----+----------+
| id | username |
+----+----------+
|  1 | foo      |
+----+----------+
1 row in set (0.00 sec)

我们要在此示例中选择的行是level=2clear_time=2014-11-09 11:22:40。这是我的疑问:

MariaDB [test]> SELECT t1.user_id, t2.username, t1.level, t3.clear_time
FROM 
   (SELECT user_id, max(level) as level FROM gameplay GROUP BY user_id) as t1
INNER JOIN (users t2, gameplay t3)
ON t1.user_id=t2.id AND t3.level=t1.level AND t3.user_id=t1.user_id;

+---------+----------+-------+---------------------+

| user_id | username | level | clear_time          |
+---------+----------+-------+---------------------+
|       1 | foo      |     2 | 2014-11-09 11:22:40 |
+---------+----------+-------+---------------------+
1 row in set (0.00 sec)