Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL zlicza kolejne daty dla bieżącej passy

Zapytanie przechowuje liczbę smug w zmiennej, a gdy tylko pojawi się luka, resetuje liczbę do dużej wartości ujemnej. Następnie zwraca największą passę.

W zależności od tego, ile głosów może mieć użytkownik, może być konieczna zmiana -99999 do większej (ujemnej) wartości.

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

Aktualizacja

Kolejna odmiana

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

Uwaga, skrzypce zwrócą prawidłowe smugi tylko wtedy, gdy zostaną uruchomione w dniu tego posta :)

Aktualizacja 2

Poniższe zapytanie działa z tabelami, które umożliwiają wielokrotne głosowanie dziennie przez tego samego użytkownika, wybierając z tabeli pochodnej, w której zduplikowane daty są usuwane.

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żesz chcieć zastąpić select * z select streak + 1 w zależności od tego, czy chcesz uwzględnić pierwszy głos w serii.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klucz obcy MySQL podczas usuwania

  2. Dlaczego nie powinienem używać funkcji mysql_* w PHP?

  3. Partycjonowanie / sharding / dzielenie MySQL - w którą stronę iść?

  4. Zmieniasz bieżącą liczbę wartości Auto Increment w MySQL?

  5. MyISAM kontra InnoDB