मैं संरचना के साथ एक MySQL तालिका है की अधिकतम अवधि तक जाँच हो रही है:लगातार दिन जो विशिष्ट शर्त पूरी
beverages_log (आईडी, users_id, beverages_id, टाइमस्टैम्प)
मैं अधिकतम लकीर गणना करने के लिए कोशिश कर रहा हूँ लगातार दिनों के दौरान एक उपयोगकर्ता (आईडी 1 के साथ) प्रत्येक दिन कम से कम 5 बार एक पेय (आईडी 1 के साथ) लॉग करता है। मैं बहुत यकीन है कि यह विचारों का उपयोग इस प्रकार किया जा सकता है कि कर रहा हूँ:
CREATE or REPLACE VIEW daycounts AS
SELECT count(*) AS n, DATE(timestamp) AS d FROM beverages_log
WHERE users_id = '1' AND beverages_id = 1 GROUP BY d;
CREATE or REPLACE VIEW t AS SELECT * FROM daycounts WHERE n >= 5;
SELECT MAX(streak) AS current FROM (SELECT DATEDIFF(MIN(c.d), a.d)+1 AS streak
FROM t AS a LEFT JOIN t AS b ON a.d = ADDDATE(b.d,1)
LEFT JOIN t AS c ON a.d <= c.d
LEFT JOIN t AS d ON c.d = ADDDATE(d.d,-1)
WHERE b.d IS NULL AND c.d IS NOT NULL AND d.d IS NULL GROUP BY a.d) allstreaks;
हालांकि, विभिन्न उपयोगकर्ताओं के लिए विचारों को बार-बार बनाने हर बार जब मैं इस जांच चलाने सुंदर अक्षम लगता है। क्या MySQL में एक ही प्रश्न में इस गणना को निष्पादित करने के लिए कोई तरीका है, बिना विचार किए या बार-बार समान सबक्विरीज़ को बार-बार बुलाते हुए?
हाँ, यह अच्छी तरह से काम करता है - धन्यवाद! मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं "अंदरूनी जॉइन (SELECT @prev: = NULL, @c: = 1) AS vars" - क्या यह चर को साफ़ करने के लिए है? –
यह सुनिश्चित करने के लिए है कि उनके पास क्वेरी के पिछले भाग से कोई मान नहीं है। – nnichols
गोचा। एक और सवाल - यह कैसे है कि @prev वास्तव में पिछली पंक्ति की तारीख का जिक्र कर रहा है? ऐसा लगता है कि अगर इसे "@prev: = t.d" के रूप में परिभाषित किया गया है, तो यह केवल वर्तमान पंक्ति की तारीख देगा। –