Truy vấn giữ số lượng vệt trong một biến và ngay sau khi có khoảng trống, nó sẽ đặt lại số lượng thành số âm lớn. Sau đó, nó trả về chuỗi lớn nhất.
Tùy thuộc vào số lượng phiếu bầu mà người dùng có thể có, bạn có thể cần thay đổi -99999
thành một giá trị lớn hơn (âm).
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
Cập nhật
Một biến thể khác
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
Lưu ý, fiddle sẽ chỉ trả về các vệt chính xác nếu được chạy vào ngày đăng bài viết này :)
Cập nhật 2
Truy vấn bên dưới hoạt động với các bảng cho phép nhiều phiếu bầu mỗi ngày bởi cùng một người dùng bằng cách chọn từ bảng dẫn xuất nơi các ngày trùng lặp được xóa.
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
Bạn có thể muốn thay thế select *
với select streak + 1
tùy thuộc vào việc bạn có muốn bao gồm phiếu bầu đầu tiên trong chuỗi hay không.