我有一个包含以下字段的游戏桌:
user_id, level, clear_time
有N个级别,表格跟踪用户何时超过某个级别。现在,我需要根据两个约束对用户进行排名:level
和clear_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)
值的相应字段。我该如何做到这一点?
答案 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=2
,clear_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)