Die Abfrage hält die Streak-Zählung in einer Variablen und setzt die Zählung auf einen großen negativen Wert zurück, sobald eine Lücke vorhanden ist. Es gibt dann den größten Streifen zurück.
Abhängig davon, wie viele Stimmen ein Benutzer haben kann, müssen Sie möglicherweise -99999
ändern auf einen größeren (negativen) Wert.
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
Aktualisieren
Eine weitere Variante
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
Beachten Sie, dass Fiddle nur dann korrekte Streaks zurückgibt, wenn es zum Datum dieses Posts ausgeführt wird :)
Aktualisierung 2
Die folgende Abfrage funktioniert mit Tabellen, die mehrere Stimmen pro Tag durch denselben Benutzer zulassen, indem sie aus einer abgeleiteten Tabelle auswählen, in der doppelte Daten entfernt werden.
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
Vielleicht möchten Sie select *
ersetzen mit select streak + 1
je nachdem, ob Sie die 1. Stimme in den Streak aufnehmen möchten.