2017-03-24 84 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;