sql >> Base de Datos >  >> RDS >> Mysql

MySQL cuenta fechas consecutivas para la racha actual

La consulta mantiene el conteo de rachas en una variable y tan pronto como hay una brecha, restablece el conteo a un gran negativo. Luego devuelve la racha más grande.

Dependiendo de cuántos votos pueda tener un usuario, es posible que deba cambiar -99999 a un valor mayor (negativo).

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

Actualizar

Otra variación

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

Tenga en cuenta que fiddle solo devolverá las rayas correctas si se ejecuta en la fecha de esta publicación :)

Actualización 2

La consulta a continuación funciona con tablas que permiten múltiples votos por día por parte del mismo usuario seleccionando de una tabla derivada donde se eliminan las fechas duplicadas.

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

Es posible que desee reemplazar select * con select streak + 1 dependiendo de si desea incluir el primer voto en la racha.