2013-05-19 10 views
8

Ho una serie di post su base mensile. Ora ho bisogno di un array che contenga record totali di post pubblicati in ciascun mese. Ho provato sotto la query MySql, funziona bene, ma mi aspettavo 0 (zero) per mesi in cui non ci sono record. Qui non restituisce 0.Conteggio MySql() per restituire 0 se non sono stati trovati record

Ho letto che COUNT() non restituisce '0', quindi come faccio a raggiungere questo?

Ho provato IFNULL() e COALESCE() ma ottenendo sempre lo stesso risultato. Si prega di aiutare con questa query. Grazie ......

SELECT 
count(id) as totalRec 
FROM ('post') 
WHERE year(date) = '2013' 
AND monthname(date) IN ('January', 'February', 'March') 
GROUP BY year(date)-month(date) 
ORDER BY 'date' ASC 

Got Risultato:

+----------+ 
| totalRec | 
+----------+ 
|  7 | 
|  9 | 
+----------+ 

Risultato previsto (Dove non sono messaggi di gennaio):

+----------+ 
| totalRec | 
+----------+ 
|  0 | 
|  7 | 
|  9 | 
+----------+ 

dati di esempio:

+----+---------------------+ 
| id | date    | 
+----+---------------------+ 
| 24 | 2012-12-16 16:29:56 | 
| 1 | 2013-02-25 14:57:09 | 
| 2 | 2013-02-25 14:59:37 | 
| 4 | 2013-02-25 15:12:44 | 
| 5 | 2013-02-25 15:14:18 | 
| 7 | 2013-02-26 11:31:31 | 
| 8 | 2013-02-26 11:31:59 | 
| 10 | 2013-02-26 11:34:47 | 
| 14 | 2013-03-04 04:39:02 | 
| 15 | 2013-03-04 05:44:44 | 
| 16 | 2013-03-04 05:48:29 | 
| 19 | 2013-03-07 15:22:34 | 
| 20 | 2013-03-15 12:24:43 | 
| 21 | 2013-03-16 16:27:43 | 
| 22 | 2013-03-16 16:29:28 | 
| 23 | 2013-03-16 16:29:56 | 
| 11 | 2013-03-17 11:35:12 | 
+----+---------------------+ 
+1

può dare record di esempio in cui possiamo giocare con? –

+0

Il tuo gruppo sembra non corretto –

+0

@JW 웃 Ho modificato la mia domanda con dati di esempio .. – sravis

risposta

15

Non esiste alcun record per il mese di January ed è per questo che non si ottengono risultati. Una soluzione che funziona è quella di unire una subquery con un elenco di mesi che si desidera visualizzare nell'elenco.

SELECT count(b.id) as totalRec 
FROM (
      SELECT 'January' mnth 
      UNION ALL 
      SELECT 'February' mnth 
      UNION ALL 
      SELECT 'March' mnth 
     ) a 
     LEFT JOIN post b 
      ON a.mnth = DATE_FORMAT(b.date, '%M') AND 
       year(b.date) = '2013' AND 
       DATE_FORMAT(b.date, '%M') IN ('January', 'February', 'March') 
GROUP BY year(b.date)-month(b.date) 
ORDER BY b.date ASC 

USCITA

╔══════════╗ 
║ TOTALREC ║ 
╠══════════╣ 
║  0 ║ 
║  7 ║ 
║  9 ║ 
╚══════════╝ 
+0

bello. Stavo per fare anche un violino di sql. ma tu mi hai battuto - come al solito :) +1 – luksch

+0

WOW, grazie mille. Stavo provando da 1 ora passata per ottenere questo risultato, Finalmente mi hai salvato il mio tempo. Grazie mille .. – sravis

+0

@JW Ho aggiunto il mese di aprile alla lista di selezione nel tuo esempio JSfiddle, quindi il risultato dovrebbe essere [0,7,9,0] ma la sua visualizzazione [0,7,9]. Puoi vedere per favore una volta? http://www.sqlfiddle.com/#!2/e0a6e/15 – sravis

3

Hai provato IFNULL() nel modo giusto ? Forse provare IFNULL(Count(id), 0) in una clausola SELECT con join.

3

COALESCE è ciò che è possibile utilizzare, se si dispone di una tabella di date e sinistra contro di essa. Va da sinistra a destra per restituire il primo valore non nullo. Il tuo gruppo sembra un po 'pazzo al minuto, l'ho aggiustato.

SELECT 
COALESCE(count(id),0) as totalRec 
FROM ('post') 
LEFT JOIN dates 
ON dates.date = post.date 
WHERE year(date) = '2013' 
AND monthname(date) IN ('January', 'February', 'March') 
GROUP BY month(date), year(date) 
ORDER BY 'date' ASC 

Dove tavolo date is ..

DATE 
2013-01-01 
2013-01-02 
2013-01-03 
etc.... 

vedere qui: http://easywebapps.blogspot.co.uk/2011/07/mysql-how-to-create-calendar-table.html

+0

Ho provato la tua query e ottengo ancora lo stesso risultato – sravis

+0

Mi spiace, ho perso il bit di creazione della tabella data, che è importante –

1

Se il set di risultati non ha avuto messaggi durante quel periodo di tempo, non sarà possibile ottenere alcun risultato a contare, quindi perché non mostra.

È necessario unirsi a un'altra tabella con tutti i mesi dell'anno o inserire i dati a livello di codice quando vengono restituiti i risultati. Non riesco a pensare a un altro modo per farlo, ma forse è possibile.

Inoltre, come altri hanno detto, separare il gruppo con una virgola.

0

Penso che è sufficiente interrogare come in questo esempio vb

SELECT COALESCE(COUNT(id),0) AS totid FROM table 

Set count=Con.Execute("SELECT COALESCE(COUNT(id),0) AS totid FROM table") 

poi scrivere

<%=count("totid")%> 
Problemi correlati