sql >> Databáze >  >> RDS >> Mysql

MySQL počítá po sobě jdoucí data pro aktuální sérii

Dotaz uchovává počet pruhů v proměnné a jakmile dojde k mezerě, resetuje počet na velké záporné číslo. Poté vrátí největší pruh.

V závislosti na tom, kolik hlasů může uživatel mít, budete možná muset změnit -99999 na větší (zápornou) hodnotu.

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

Aktualizovat

Další variace

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

Poznámka, housle vrátí správné pruhy, pouze pokud budou spuštěny k datu tohoto příspěvku :)

Aktualizace 2

Níže uvedený dotaz pracuje s tabulkami, které umožňují vícenásobné hlasování za den stejným uživatelem výběrem z odvozené tabulky, kde jsou odstraněna duplicitní data.

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

Možná budete chtít nahradit select * pomocí select streak + 1 podle toho, zda chcete zahrnout 1. hlas do série.



  1. Nelze se připojit k databázi:Přístup odepřen uživateli ''@'localhost' k databázi 'socialdb'

  2. Tabulka vnitřního spojení s ohledem na maximální hodnotu

  3. Poddotaz Oracle nevidí proměnnou z vnějšího bloku o 2 úrovně výše

  4. Příkazy nejsou synchronizovány; tento příkaz nyní nemůžete spustit