De query houdt het aantal streaks in een variabele en zodra er een gat is, wordt het aantal teruggezet naar een groot negatief. Het geeft dan de grootste streak terug.
Afhankelijk van het aantal stemmen dat een gebruiker kan hebben, moet u mogelijk -99999
. wijzigen naar een grotere (negatieve) waarde.
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
Bijwerken
Een andere variatie
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
Let op, fiddle geeft alleen correcte strepen als het op de datum van dit bericht wordt uitgevoerd :)
Update 2
De onderstaande query werkt met tabellen die meerdere stemmen per dag door dezelfde gebruiker toestaan door te selecteren uit een afgeleide tabel waarin dubbele datums worden verwijderd.
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
Misschien wil je select *
. vervangen met select streak + 1
afhankelijk van of u de eerste stem in de reeks wilt opnemen.