Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL zählt aufeinanderfolgende Daten für den aktuellen Streak

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.