2013-08-23 6 views
9

मैं तिथि के अनुसार आदेश दिए गए पिछले वर्ष सबमिट की गई रिपोर्टों की संख्या देने के लिए एक प्रश्न औपचारिक रूप से तैयार कर रहा हूं। मैं php के साथ चालू वर्ष और महीने मिलती है:कोई गिनती कैसे प्राप्त करें भले ही कोई परिणाम mysql से संबंधित न हो?

$year = date('Y') - 1; 
$month = date('m'); 

और निम्न क्वेरी निष्पादित करें: एसक्यूएल:

SELECT month(date_lm) AS `month` , 
count(*) AS `count` 
FROM `reports` 
WHERE (status = 'submitted') 
AND (date_lm > 2012-08) 
GROUP BY month(date_lm) 
ORDER BY month(date_lm) ASC 

और क्योंकि वहाँ केवल 1 पिछले वर्ष में प्रस्तुत किया गया है यह मुझे केवल देता है 1 परिणाम ...

| month | count | 
| 7 | 1 | 

लेकिन मैं परिणाम सेट की तरह दिखाने के लिए होगा:

| month | count | 
| 9 | 0 | 
| 10 | 0 | 
| 11 | 0 | 
| 12 | 0 | 
| 1 | 0 | 
| 2 | 0 | 
| 3 | 0 | 
| 4 | 0 | 
| 5 | 0 | 
| 6 | 0 | 
| 7 | 1 | 
| 8 | 0 | 

क्या यह संभव है?

उत्तर

2

आप 1..12 की मेज के साथ इस तालिका में शामिल हों LEFT चाहिए दे देंगे। कुछ इस तरह:

SELECT Months.id AS `month` , 
COUNT(`reports`.date_lm) AS `count` 
FROM 
(
    SELECT 1 as ID UNION SELECT 2 as ID UNION SELECT 3 as ID UNION SELECT 4 as ID 
    UNION 
    SELECT 5 as ID UNION SELECT 6 as ID UNION SELECT 7 as ID UNION SELECT 8 as ID 
    UNION 
    SELECT 9 as ID UNION SELECT 10 as ID UNION SELECT 11 as ID UNION SELECT 12 as ID 
) as Months 
LEFT JOIN `reports` on Months.id=month(`reports`.date_lm) 
         AND 
         (status = 'submitted') 
         AND (date_lm > 2012-08) 
GROUP BY Months.id 
ORDER BY Months.id ASC 

SQL Fiddle demo

+0

हाय धन्यवाद, यह कानूनी लगता है लेकिन मुझे एक फ़ंक्शन रिपोर्ट मिलती है। माह मौजूद नहीं है। फ़ंक्शन नाम पार्सिंग और रिज़ॉल्यूशन के साथ जांचें। – surfer190

+0

@StevieG: निश्चित क्वेरी – valex

+0

आज़माएं अब यह काम कर रहा है, लेकिन आउटपुट अभी भी 9 से 8 तक आउटपुट नहीं कर रहा है। इसलिए केवल जब एक पंक्ति जो शर्तों को पूरा करती है तो इसे जोड़ा जाता है। तो 0 गिनती के साथ कोई नहीं है। – surfer190

3

ऐसा करने के लिए, आप 'माह' तालिका बना सकते हैं और फिर उस तालिका और रिपोर्ट तालिका के बीच बाएं बाहरी जुड़ने का उपयोग कर सकते हैं।

मैं तो क्षमा याचना mysql उपयोग नहीं किया है, तो वाक्य रचना थोड़ा दूर है, लेकिन इस क्वेरी होगा:

SELECT months.monthNumber, 
    count(reports.id) AS `count` 
FROM `months` left outer join `reports` on months.monthNumber = month(reports.date_lm) 
WHERE (status = 'submitted') 
AND (date_lm > 2012-08) 
GROUP BY monthNumber 
ORDER BY monthNumber ASC 

महत्वपूर्ण बात, गिनती रिपोर्ट तालिका में किसी स्तंभ, महीने की होनी चाहिए टेबल, या नहीं तो आपको कभी शून्य नहीं मिलेगा।

0

आशा इस मदद कर सकते हैं ..

SELECT t1.month_year AS month, COALESCE(SUM(t1.total+t2.total), 0) AS count FROM ( SELECT DATE_FORMAT(a.Date, "%Y-%m") AS md, DATE_FORMAT(a.Date, "%b-%y") AS month_year, '0' AS total FROM ( SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.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 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 c ) a WHERE a.Date <= NOW() AND a.Date >= Date_add(Now(),INTERVAL - 11 MONTH) GROUP BY md )t1 LEFT JOIN ( SELECT DATE_FORMAT(created_at, "%b") AS month, COUNT(*) AS total ,DATE_FORMAT(created_at, "%Y-%m") AS md FROM reports WHERE created_at <= NOW() AND created_at >= Date_add(Now(),INTERVAL - 11 MONTH) AND स्थिति = 1 GROUP BY md )t2 ON t2.md = t1.md LEFT JOIN ( SELECT DATE_FORMAT(date_lm, "%b") AS month, COUNT(*) AS total ,DATE_FORMAT(date_lm, "%Y-%m") AS md FROM tbl_users WHERE date_lm <= NOW() AND date_lm >= Date_add(Now(),INTERVAL - 11 MONTH) AND status = 'submitted' GROUP BY md )t3 ON t3.md = t1.md GROUP BY t1.md ORDER BY t1.md

यह पिछले 12 महीनों के लिए डेटा दे देंगे, भले ही इसके लिए कोई डाटा नहीं है 0 ..

संबंधित मुद्दे

 संबंधित मुद्दे