Kueri menyimpan hitungan beruntun dalam sebuah variabel dan segera setelah ada celah, itu menyetel ulang hitungan ke negatif besar. Kemudian mengembalikan coretan terbesar.
Bergantung pada berapa banyak suara yang dimiliki pengguna, Anda mungkin perlu mengubah -99999
ke nilai yang lebih besar (negatif).
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
Perbarui
Variasi lain
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
Catatan, biola hanya akan mengembalikan coretan yang benar jika dijalankan pada tanggal posting ini :)
Perbarui 2
Kueri di bawah ini berfungsi dengan tabel yang memungkinkan beberapa suara per hari oleh pengguna yang sama dengan memilih dari tabel turunan tempat tanggal duplikat dihapus.
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
Anda mungkin ingin mengganti select *
dengan select streak + 1
tergantung pada apakah Anda ingin menyertakan suara pertama secara berurutan.