sql >> Database teknologi >  >> RDS >> Mysql

MySQL tæller på hinanden følgende datoer for den aktuelle streak

Forespørgslen holder streak-antallet i en variabel, og så snart der er et hul, nulstiller den tællingen til en stor negativ. Det returnerer derefter den største streak.

Afhængigt af hvor mange stemmer en bruger kan have, skal du muligvis ændre -99999 til en større (negativ) værdi.

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

Opdater

Endnu en variation

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

Bemærk, violin vil kun returnere korrekte streger, hvis den køres på datoen for dette indlæg :)

Opdatering 2

Forespørgslen nedenfor fungerer med tabeller, der tillader flere stemmer pr. dag af den samme bruger ved at vælge fra en afledt tabel, hvor duplikerede datoer fjernes.

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

Du vil måske erstatte select * med select streak + 1 alt efter om du vil have 1. stemme med i rækken.



  1. MySQL Forespørgsel om at vælge data fra sidste uge?

  2. Dataforbindelsesændringer i 2020.24

  3. Introduktion til SQL Server

  4. En guide til implementering af TimescaleDB med Docker