आपको एक 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 व्युत्पन्न तालिका को भी बदल दिया है शुरुआती बिंदु को भविष्य में धकेलने के लिए, और मैंने इसका आकार कम कर दिया है। ये दोनों विकल्प हैं और जैसा आप उचित समझें, उनमें बदलाव किया जा सकता है।
प्रत्येक पंक्ति के लिए डोमेन_आईडी पर पहुंचने के लिए (जैसा कि आपके प्रश्न में दिखाया गया है) आपको निम्न की तरह कुछ का उपयोग करने की आवश्यकता होगी; ध्यान दें कि आप 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;