Frågan behåller streak count i en variabel och så snart det finns ett gap återställs räkningen till ett stort negativt. Det ger sedan den största streaken.
Beroende på hur många röster en användare kan ha kan du behöva ändra -99999
till ett större (negativt) värde.
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
Uppdatera
En annan variant
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
Notera, fiol kommer bara att returnera korrekta streck om den körs vid datumet för detta inlägg :)
Uppdatering 2
Frågan nedan fungerar med tabeller som tillåter flera röster per dag av samma användare genom att välja från en härledd tabell där dubbletter av datum tas bort.
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
Du kanske vill ersätta select *
med select streak + 1
beroende på om du vill ha med 1:a rösten i raden.