sql >> Database >  >> RDS >> Mysql

MySQL telt opeenvolgende datums voor huidige streak

De query houdt het aantal streaks in een variabele en zodra er een gat is, wordt het aantal teruggezet naar een groot negatief. Het geeft dan de grootste streak terug.

Afhankelijk van het aantal stemmen dat een gebruiker kan hebben, moet u mogelijk -99999 . wijzigen naar een grotere (negatieve) waarde.

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

Bijwerken

Een andere variatie

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

Let op, fiddle geeft alleen correcte strepen als het op de datum van dit bericht wordt uitgevoerd :)

Update 2

De onderstaande query werkt met tabellen die meerdere stemmen per dag door dezelfde gebruiker toestaan ​​door te selecteren uit een afgeleide tabel waarin dubbele datums worden verwijderd.

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

Misschien wil je select * . vervangen met select streak + 1 afhankelijk van of u de eerste stem in de reeks wilt opnemen.



  1. MySQL:waarom varchar(254) en niet varchar(255)?

  2. Hulp nodig bij sql-query om dingen te vinden die zijn getagd met alle opgegeven tags

  3. SQL TRUNCATE-syntaxis - weergegeven door DBMS

  4. Voeg rijen in dezelfde id samen in een array