एक और अपडेट: गलती से (कॉपी और पेस्ट करके) starttime = ... or starttime = ...
. था लेकिन यह starttime = ... or endtime = ...
होना चाहिए
अद्यतन करें:
मेरी क्वेरी को और अधिक विस्तार से समझाने के लिए (अंतिम प्रश्न में और भी टिप्पणियाँ हैं):
पहले हमें बस
. मिलाSELECT
...
FROM gc_sessions s
WHERE DATE(starttime) = CURDATE() OR DATE(endtime) = CURDATE()
यह कहने जैसा कुछ नहीं है "मुझे उन सभी उपयोगकर्ताओं को दें जिनका सत्र आज शुरू हुआ या आज समाप्त हुआ"। उन दो बार बार-बार विचार करने से प्रश्न थोड़ा अटपटा हो जाता है, लेकिन वास्तव में यह उतना जटिल नहीं है।
इसलिए, आमतौर पर हम कुछ गिनने के लिए COUNT () फ़ंक्शन का उपयोग करेंगे, जाहिर है, लेकिन चूंकि हम "सशर्त गणना" चाहते हैं, हम केवल SUM () फ़ंक्शन का उपयोग करते हैं और यह बताते हैं कि कब 1 जोड़ना है और कब नहीं।
SUM (CASE WHEN ... THEN 1 ELSE 0 END) AS a_column_name
SUM () फ़ंक्शन आज से सत्रों के परिणाम सेट में अब प्रत्येक पंक्ति की जांच करता है। इसलिए इस परिणाम सेट में प्रत्येक उपयोगकर्ता के लिए हम देखते हैं कि क्या यह उपयोगकर्ता हमारे द्वारा निर्दिष्ट तिथि को ऑनलाइन था। इससे कोई फर्क नहीं पड़ता कि वह कितनी बार ऑनलाइन था, इसलिए प्रदर्शन कारणों से हम EXISTS
का उपयोग करते हैं . EXISTS
के साथ आप एक सबक्वेरी निर्दिष्ट कर सकते हैं जो कुछ मिलते ही रुक जाती है, इसलिए इससे कोई फर्क नहीं पड़ता कि कुछ मिलने पर यह क्या लौटाता है, जब तक कि यह NULL
नहीं है . इसलिए भ्रमित न हों कि मैंने 1
को क्यों चुना? . सबक्वेरी में हमें उस यूजर को कनेक्ट करना होता है जो वर्तमान में बाहरी क्वेरी से यूजर के साथ इनर क्वेरी (सबक्वेरी) से जांचा जाता है और टाइम विंडो को निर्दिष्ट करता है। अगर सभी मानदंड पहले बताए गए अनुसार गिनती 1 और 0 को पूरा करते हैं।
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndYesterday,
फिर हम प्रत्येक शर्त और वॉइला के लिए एक कॉलम बनाते हैं, आपके पास एक प्रश्न में वह सब है जो आपको चाहिए। तो आपके अद्यतन प्रश्न के साथ आपका मानदंड बदल गया है, हमें बस और नियम जोड़ने होंगे:
SELECT
/*this is like before*/
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS FridayAndThursday,
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 2 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 2 DAY)))
/*this one here is a new addition, since you don't want to count the users that were online yesterday*/
AND NOT EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS FridayAndWednesdayButNotThursday,
SUM(CASE WHEN
EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 3 DAY) /* minus 3 days to get tuesday*/
OR (date(endtime) = CURDATE() - INTERVAL 3 DAY)))
/*this is the same as before, we check again that the user was not online between today and tuesday, but this time we really use BETWEEN for convenience*/
AND NOT EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)
OR (date(endtime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS FridayAndTuesdayButNotThursdayAndNotWednesday,
.../*and so on*/
FROM gc_sessions s
WHERE DATE(starttime) = CURDATE() OR DATE(endtime) = CURDATE()
तो, मुझे आशा है कि अब आपको यह विचार मिल गया होगा। कोई और प्रश्न? पूछने के लिए स्वतंत्र।
अपडेट की समाप्ति
प्रश्न के पिछले संस्करण का उत्तर:
select
SUM(CASE WHEN EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) = CURDATE() - INTERVAL 1 DAY)
OR (date(starttime) = CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndYesterday,
SUM(CASE WHEN EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)
OR (date(starttime) BETWEEN CURDATE() - INTERVAL 2 DAY AND CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndYesterdayOrTheDayBeforeYesterday,
SUM(CASE WHEN EXISTS (SELECT 1 FROM gc_sessions sub_s WHERE s.user = sub_s.user
AND ((date(starttime) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() - INTERVAL 1 DAY)
OR (date(starttime) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() - INTERVAL 1 DAY)))
THEN 1 ELSE 0 END) AS todayAndWithinTheLastWeek
from gc_sessions s
where date(starttime) = CURDATE()
or date(endtime) = CURDATE()