Заявката запазва броя на сериите в променлива и веднага щом има празнина, нулира броя на голям минус. След това връща най-голямата ивица.
В зависимост от това колко гласа може да има даден потребител, може да се наложи да промените -99999
до по-голяма (отрицателна) стойност.
select if(max(maxcount) < 0, 0, max(maxcount)) streak
from (
select
if(datediff(@prevDate, datecreated) = 1, @count := @count + 1, @count := -99999) maxcount,
@prevDate := datecreated
from votes v cross join
(select @prevDate := date(curdate() + INTERVAL 1 day), @count := 0) t1
where username = 'bob'
and datecreated <= curdate()
order by datecreated desc
) t1;
http://sqlfiddle.com/#!2/37129/6
Актуализиране
Друг вариант
select * from (
select datecreated,
@streak := @streak+1 streak,
datediff(curdate(),datecreated) diff
from votes
cross join (select @streak := -1) t1
where username = 'bob'
and datecreated <= curdate()
order by datecreated desc
) t1 where streak = diff
order by streak desc limit 1
http://sqlfiddle.com/#!2/c6dd5b/20
Обърнете внимание, че fiddle ще връща само правилни ивици, ако се стартира на датата на тази публикация :)
Актуализация 2
Заявката по-долу работи с таблици, които позволяват множество гласове на ден от един и същ потребител, като се избира от извлечена таблица, където се премахват дублиращи се дати.
select * from (
select date_created,
@streak := @streak+1 streak,
datediff(curdate(),date_created) diff
from (
select distinct date(date_created) date_created
from votes where username = 'pinkpopcold'
) t1
cross join (select @streak := -1) t2
order by date_created desc
)
t1 where streak = diff
order by streak desc limit 1
http://sqlfiddle.com/#!2/5fc6d/7
Може да искате да замените select *
с select streak + 1
в зависимост от това дали искате да включите 1-вия глас в поредицата.