Forespørgslen holder streak-antallet i en variabel, og så snart der er et hul, nulstiller den tællingen til en stor negativ. Det returnerer derefter den største streak.
Afhængigt af hvor mange stemmer en bruger kan have, skal du muligvis ændre -99999
til en større (negativ) værdi.
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
Opdater
Endnu en variation
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
Bemærk, violin vil kun returnere korrekte streger, hvis den køres på datoen for dette indlæg :)
Opdatering 2
Forespørgslen nedenfor fungerer med tabeller, der tillader flere stemmer pr. dag af den samme bruger ved at vælge fra en afledt tabel, hvor duplikerede datoer fjernes.
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 vil måske erstatte select *
med select streak + 1
alt efter om du vil have 1. stemme med i rækken.