mysql - Complex Join Sql query With timer -


मेरे पास 3 टेबल हैं

लॉग

  | id | चैनल_आईडी | तिथि | Content_id | | 1 | 3 | & LT; ts & gt; | 1 | | 1 | 3 | & LT; ts & gt; | 2 | | 1 | 4 | & LT; ts & gt; | 4 |  

चैनल

  | आईडी | चैनल_आईडी | Limit_repeat_time | सीमा_टाइमर | Limit_count | Last_update | 1 | 3 | 60 | 1440 | 50 | & LT; टाइमस्टैम्प & gt; | 1 | 4 | 60 | 1440 | 50 | & LT; टाइमस्टैम्प & gt;  

कतार

  | आईडी | चैनल_आईडी | Content_id | 1 | 3 | 1 | 1 | 3 | 2 | 1 | 4 | 4  

मेरे पास तालिकाओं और छोरों की जांच करने के लिए एक क्रॉन्टाब है और मुझे उन चैनलों की सूची मिलती है जिन्हें मुझे अपडेट करना पड़ता है;

चैनलों के पास कुछ विकल्प हैं 1) limit_repeat समय: इसका मतलब यह क्रॉन इस चैनल से कम इस चैनल को अपडेट नहीं कर सकता; Exc: यदि यह एक 60 है तो आप केवल हर घंटे इस चैनल को अपडेट कर सकते हैं। 2) limit_timer और limit_count यह एक पूरी सीमा की गिनती है। पसंद; Limit_timer = 1440 limit_count = 50 इसका मतलब यह है कि आप प्रति दिन 50 सामग्री अधिकतम (1440 मिनट) जोड़ सकते हैं

मुझे क्या चाहिए मैं चैनलों को अद्यतन नहीं करना चाहता हूँ और इसके बाद में सामग्री को और भी स्थगित नहीं किया

मेरा क्रोन हर मिनट पर सेट है, इसलिए मैं हर मिनट इस क्वेरी को चलाने के लिए और अद्यतन चैनलों की आवश्यकता है।

धन्यवाद अग्रिम में!

< Div class = "post-text" itemprop = "text">

मेरा मानना ​​है कि आप यही चाहते हैं। यह कतार कि दो मानदंडों fullfil से रिकॉर्ड का चयन करता है:

1) DATE_ADD (मैक्स (l.date), अंतराल ch.limit_repeat_time मिनट) & lt; = NOW ( ) - जांचें कि क्या लॉग तालिका में अंतिम रिकॉर्ड कम से कम ch.limit_repeat_time मिनटों की वर्तमान प्रणाली समय से पुराना है।

2 ) (COUNT का चयन करें (*) लॉग एल 1 से जहां तिथि (l1.date) = DATE (NOW ()) और l1.channel_id = q.channel_id) & lt; = ch.limit_count

यह सुनिश्चित करता है कि वर्तमान दिन के लिए चैनल में लॉग तालिका के लिए ch.limit_count रिकॉर्ड से अधिक नहीं है।

आपके उदाहरण में आपके आईडी फ़ील्ड थोड़ा अराजक हैं - सभी के बराबर 1, मुझे नहीं लगता कि यह वास्तविक डेटा है यह भी नहीं देख क्यों चैनल तालिका में channel_id और id है। यह मेरे लिए जरूरी नहीं लगता है

पूरे चयन:।

  का चयन करें q.channel_id, `queue` से q.content_id क्ष अंदरूनी रूप में शामिल होने` channels` ch ch पर .channel_id = q.channel_id बायाँ शामिल हों पर l.channel_id = q.channel_id ग्रुप q.channel_id, q.content_id, ch.limit_repeat_time, ch.limit_count होने (मैक्स (l.date द्वारा `logs` एल) नल या DATE_ADD (IS मैक्स (l.date), अंतराल ch.limit_repeat_time मिनट) & lt; = NOW ()) और IFNULL ((COUNT का चयन करें (*) `से logs` एल 1 जहां तिथि (l1.date) = DATE (NOW ()) और L1 .channel_id = q.channel_id), 0) & lt; ch.limit_count  

इसे देखें।

यह क्वेरी स्थिति को कवर नहीं करती है, जब आपके पास पहले से ही 49 आइटम संसाधित और कतार में 10 नए आइटम हैं - सभी 10 नई कतार वस्तुओं को फिर से लौटा दिया जाएगा, इसलिए आपको नए आइटम जोड़ते समय limit_count का एक अतिरिक्त चेक करना होगा।

SELECT q.channel_id, q यदि आप सभी तरह से अपने channel.last_update नए रिकॉर्ड को सम्मिलित करने के बाद अद्यतन करते हैं, तो भी आप इस क्वेरी को सरल कर सकते हैं। = NOW () और (का चयन करें; `queue` के रूप में क्ष अंदरूनी शामिल हों` channels` ch पर ch.channel_id = q.channel_id कहां ch.last_update नल या DATE_ADD (ch.last_update, अंतराल ch.limit_repeat_time मिनट) & lt से .content_id `लॉग 'से 1 (*) एल 1 कहां दिनांक (l1.date) = DATE (अब ()) और l1.channel_id = q.channel_id) & lt; ch.limit_count;


Comments