2017-03-24 83 views
-1

我有一個MySQL表,它基本上存儲一個點的列表引用了該點的玩家ID。MYSQL - 計數連續相同的值

我的設置是:

CREATE TABLE `points` (
    `id` int(10) unsigned NOT NULL, 
    `player_id` int(10) unsigned NOT NULL, 
    `game_id` int(10) unsigned NOT NULL, 
    `score` int(11) NOT NULL, 
    `isScore` tinyint(1) NOT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL 
); 


INSERT INTO `points` (`id`, `player_id`, `game_id`, 
        `score`, `isScore`,  `created_at`, `updated_at`) 
VALUES 
(16, 11, 60, 4, 0, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(17, 11, 60, 5, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(18, 12, 60, 6, 0, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(19, 12, 60, 7, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(20, 12, 60, 8, 0, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(21, 12, 60, 9, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(22, 8, 60, 10, 0, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(23, 8, 60, 11, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(24, 12, 60, 12, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(25, 12, 60, 13, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(26, 5, 60, 14, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(27, 12, 60, 15, 0, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(28, 12, 60, 16, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(29, 10, 60, 17, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'), 
(30, 10, 60, 18, 1, '2016-12-28 12:19:39', '2016-12-28 12:19:39'); 

下面是在此設置一個SQLfiddle:http://sqlfiddle.com/#!9/f6ca9f8

我想爲每個選手的選手取得最大的連續點的數量。

所以在sqlfiddle結果會是這樣的:

+-----------+------------------------+ 
| player_id | max_consegutive_points | 
+-----------+------------------------+ 
|  12 |      4 | 
|   8 |      2 | 
|   5 |      1 | 
|  10 |      2 | 
+-----------+------------------------+ 
+0

下一次加你在這裏設置。有時候這些支持網站(如sqlfiddle)已經不存在了,在這種情況下,你的問題不會有數據。 –

+0

請解釋你的輸出 – GurV

回答

0

你的問題是缺少一些關鍵點(沒有雙關語意)。例如:什麼被認爲是連續的相同的值?您需要定義如果這些值將上市ID,created_at,ID + game_id等有序

所以我們說的順序是由ID給出的,因爲它可能會自動增加的,它是很自然的點按照它們發生的順序插入。

然而,答案將是創造與增加計數器變量(ACCUM)查詢如果玩家是一個比前行中的相同,或重置爲1,如果玩家改變:

select 
    points.id, 
    points.player_id, 
    points.game_id, 
    points.created_at, 
    @counter:=IF(@playerid=points.player_id,@counter+1,1) as accum, 
    @playerid:=points.player_id as current_player_id 
from points, 
    (select @counter:=1) c, 
    (select @playerid:=0) p 
order by points.id 

See SQLFiddle here

擁有該表的結果,並把它變成一個視圖或臨時表中,我們可以稱之爲「accums」,你只需要做

SELECT player_id, max(accum) 
FROM accums 
GROUP BY player_id 
0
select distinct(player_id), MAX(score) from points group by player_id;