क्वेरी स्ट्रीक काउंट को एक वेरिएबल में रखती है और जैसे ही कोई गैप होता है यह काउंट को एक बड़े नेगेटिव पर रीसेट कर देता है। इसके बाद यह सबसे बड़ी स्ट्रीक लौटाता है।
उपयोगकर्ता के पास कितने वोट हो सकते हैं, इस पर निर्भर करते हुए आपको -99999
. को बदलने की आवश्यकता हो सकती है एक बड़े (नकारात्मक) मूल्य के लिए।
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
अपडेट करें
एक और बदलाव
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
ध्यान दें, इस पोस्ट की तारीख पर चलने पर ही फिडल सही स्ट्रीक्स लौटाएगा :)
अपडेट 2
नीचे दी गई क्वेरी उन तालिकाओं के साथ काम करती है जो एक व्युत्पन्न तालिका से चुनकर एक ही उपयोगकर्ता द्वारा प्रति दिन एकाधिक वोट की अनुमति देती हैं जहां डुप्लिकेट तिथियां हटा दी जाती हैं।
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
आप select *
. को बदलना चाह सकते हैं select streak + 1
इस पर निर्भर करता है कि आप स्ट्रीक में पहला वोट शामिल करना चाहते हैं या नहीं।