Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या यह MySQL के साथ संभव है?

एक और अपडेट: गलती से (कॉपी और पेस्ट करके) 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()


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. महीने के हिसाब से समूह खाली महीनों सहित

  2. तालिका के एक हिस्से के लिए mysqldump का उपयोग कैसे करें?

  3. एसएसआईएस और माईएसक्यूएल - टेबल का नाम डिलीमीटर मुद्दा

  4. स्क्लाइट या माईएसक्ल? कैसे तय करें?

  5. निर्दिष्ट कुंजी बहुत लंबी थी; एंटिटी फ्रेमवर्क 6 में अधिकतम कुंजी लंबाई 767 बाइट्स माइस्क्ल त्रुटि है