Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL compte les dates consécutives pour la séquence en cours

La requête conserve le nombre de séquences dans une variable et dès qu'il y a un écart, elle réinitialise le nombre à un grand négatif. Il renvoie ensuite la plus grande série.

Selon le nombre de votes qu'un utilisateur peut avoir, vous devrez peut-être modifier -99999 à une valeur plus grande (négative).

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

Mettre à jour

Une autre 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

Remarque, le violon ne renverra les séquences correctes que s'il est exécuté à la date de cet article :)

Mise à jour 2

La requête ci-dessous fonctionne avec des tables qui permettent plusieurs votes par jour par le même utilisateur en sélectionnant dans une table dérivée où les dates en double sont supprimées.

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

Vous pouvez remplacer select * avec select streak + 1 selon que vous souhaitez ou non inclure le 1er vote dans la séquence.