2013-08-23 11 views
9

Sto formalizzando una query per fornire il numero di rapporti inviati nell'ultimo anno ordinati per data. Ho l'anno e il mese corrente con php:Come ottenere un conteggio anche se non ci sono risultati corrispondenti mysql?

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

ed eseguire la seguente query: SQL:

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 

E perché c'è stato solo 1 presentata l'anno scorso mi dà solo 1 risultato ...

| month | count | 
| 7 | 1 | 

Ma vorrei il set di risultati per mostrare:

| 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 | 

È possibile?

risposta

2

Si dovrebbe LEFT JOIN questo tavolo con 1..12 tavolo. Qualcosa di simile a questo:

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

Ciao grazie, Questo sembra legittimo ma ottengo un rapporto di FUNZIONI. non esiste.Verificare l'analisi e la risoluzione del nome della funzione. – surfer190

+0

@StevieG: prova la query fissa – valex

+0

Funziona ora, ma l'output non emette ancora da 9 a 8 mesi. Quindi solo quando viene aggiunta una riga che soddisfa le condizioni. Quindi non ci sono nessuno con un conteggio 0. – surfer190

3

Per fare ciò, è possibile creare una tabella "mese" e quindi utilizzare un join esterno sinistro tra quella tabella e la tabella dei report.

non ho mai usato mysql in modo scuse se la sintassi è leggermente fuori, ma questa sarebbe la query:

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 

È importante sottolineare che il conteggio dovrebbe essere di una colonna della tabella rapporti, non i mesi tabella, altrimenti non otterresti mai uno zero.

0

Spero che questo possa aiutare ..

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 stato = 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

questo darà i dati degli ultimi 12 mesi, anche se non ci sono dati per esso con un 0 ..

Problemi correlati