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

MySQL समूह तिथि के अनुसार और लापता तिथियों सहित गिनती

आपको एक OUTER JOIN की आवश्यकता है शुरुआत और अंत के बीच हर दिन पहुंचने के लिए क्योंकि यदि आप INNER JOIN का उपयोग करते हैं यह आउटपुट को केवल उन तिथियों तक सीमित कर देगा जो शामिल हो गई हैं (अर्थात रिपोर्ट तालिका में केवल वे तिथियां)।

इसके अलावा, जब आप OUTER JOIN . का उपयोग करते हैं आपको उन शर्तों का ध्यान रखना चाहिए where clause implicit inner join . का कारण न बनें; उदाहरण के लिए और domain_id =1 यदि जहां क्लॉज में उपयोग किसी भी पंक्ति को दबा देगा, जिसमें वह शर्त पूरी नहीं हुई थी, लेकिन जब एक जॉइन कंडीशन के रूप में उपयोग किया जाता है तो यह केवल रिपोर्ट टेबल की पंक्तियों को प्रतिबंधित करता है।

SELECT
      COUNT(r.domain_id)
    , all_dates.Date AS the_date
    , domain_id
FROM (
        SELECT DATE_ADD(curdate(), INTERVAL 2 MONTH) - INTERVAL (a.a + (10 * b.a) ) DAY as Date
        FROM (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
        CROSS JOIN (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
      ) all_dates
      LEFT OUTER JOIN reports r
                  ON all_dates.Date = r.tracked_on
                        AND domain_id = 1
WHERE all_dates.Date BETWEEN '2014-09-01' AND '2014-09-30'
GROUP BY
      the_date
ORDER BY
      the_date ASC;

मैंने DATE_ADD() . का उपयोग करके all_dates व्युत्पन्न तालिका को भी बदल दिया है शुरुआती बिंदु को भविष्य में धकेलने के लिए, और मैंने इसका आकार कम कर दिया है। ये दोनों विकल्प हैं और जैसा आप उचित समझें, उनमें बदलाव किया जा सकता है।

SQLfiddle पर डेमो

प्रत्येक पंक्ति के लिए डोमेन_आईडी पर पहुंचने के लिए (जैसा कि आपके प्रश्न में दिखाया गया है) आपको निम्न की तरह कुछ का उपयोग करने की आवश्यकता होगी; ध्यान दें कि आप IFNULL() का उपयोग कर सकते हैं जो MySQL विशिष्ट है लेकिन मैंने COALESCE() . का उपयोग किया है जो अधिक सामान्य एसक्यूएल है। हालांकि यहां दिखाए गए @parameter का उपयोग वैसे भी MySQL विशिष्ट है।

SET @domain := 1;

SELECT
      COUNT(r.domain_id)
    , all_dates.Date AS the_date
    , coalesce(domain_id,@domain) AS domain_id
FROM (
        SELECT DATE_ADD(curdate(), INTERVAL 2 month) - INTERVAL (a.a + (10 * b.a) ) DAY as Date
        FROM (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
        CROSS JOIN (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
      ) all_dates
      LEFT JOIN reports r
                  ON all_dates.Date = r.tracked_on
                        AND domain_id = @domain
WHERE all_dates.Date BETWEEN '2014-09-01' AND '2014-09-30'
GROUP BY
      the_date
ORDER BY
      the_date ASC;

इसे SQLfiddle पर देखें



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आप प्रत्येक क्वेरी पर पुन:कनेक्ट किए बिना PHP में MySQL से कुशलतापूर्वक कैसे कनेक्ट होते हैं?

  2. 500 - एक त्रुटि हुई है - जूमला में नया लेख जोड़ते समय डीबी फ़ंक्शन कोई त्रुटि रिपोर्ट नहीं करता है

  3. अपना खुद का TinyURL बनाना

  4. mysql में हेक्स/बाइनरी डेटा आयात करें

  5. MySQL ट्रिगर डिबगिंग