2014-11-08 38 views
3

我有以下字段的遊戲表: user_id, level, clear_time排名 - 選擇相應列的值到MAX(列)值

有水平的一些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

聽起來像gameplay有多個條目每user_id。這就是:對x水平,具有相同user_idy水平既是一個條目,要選擇具有最高水平的clear_time相應值的行,但MAX將只能選擇該組中的最高水平,而不是來自同一行的值爲clear_time

您可以在gameplay上額外使用JOIN。編輯:這裏有一個例子,我設置:

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

工作。謝謝。 :) – 2014-11-08 19:18:37

+0

但等待,@GregBoswer,這是導致一些user_id的重複。 – 2014-11-08 20:40:38

+0

重複項是什麼樣的?相同的'level'和'user_id',但不同的'clear_time'(給定'user_id'和'level'的'gameplay'中的多個條目)? – 2014-11-08 20:51:51