2013-05-19 14 views
8

Mam zestaw postów co miesiąc. Teraz potrzebuję tablicę zawierającą wszystkie wpisy opublikowane w każdym miesiącu. Próbowałem poniżej zapytania MySql, działa poprawnie, ale oczekiwałem 0 (zero) przez miesiące, w których nie ma rekordów. Tutaj nie jest zwracana 0.MySql count(), aby zwrócić 0, jeśli nie znaleziono rekordów

Przeczytałem, że COUNT() nie zwróci "0", więc jak mam to osiągnąć?

Próbowałem IFNULL() i COALESCE(), ale nadal uzyskuję ten sam wynik. Proszę pomóc w tym zapytaniu. Dziękuję ......

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

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

oczekiwany wynik (gdzie nie ma postów do stycznia):

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

przykładowe dane:

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

można dać przykładowe rekordy, gdzie możemy zagrać? –

+0

Twoja grupa wygląda nieprawidłowo –

+0

@JW 웃 Edytowałem moje pytanie z przykładowymi danymi. – sravis

Odpowiedz

15

Brak rekordu za miesiąc January, dlatego nie uzyskujesz żadnego wyniku. Jednym z rozwiązań, które działa, jest dołączenie do podkwerendy zawierającej listę miesięcy, które mają być wyświetlane na liście.

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 

WYJŚCIE

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

fajne. również miałem zamiar zrobić sql fiddle. ale biłeś mnie - jak zwykle :) +1 – luksch

+0

WOW, Wielkie dzięki. Próbowałem od 1 godziny, aby uzyskać ten wynik, W końcu zaoszczędziłeś mój czas. Dziękuję bardzo .. – sravis

+0

@JW Dodałem miesiąc kwiecień do listy wyboru w twoim przykładzie JSfiddle, więc wynik powinien wynosić [0,7,9,0], ale pokazuje [0,7,9]. Czy możesz go raz zobaczyć? http://www.sqlfiddle.com/#!2/e0a6e/15 – sravis

3

Czy wypróbowałeś IFNULL() we właściwy sposób ? Może spróbuj IFNULL(Count(id), 0) w klauzuli SELECT z łączeniem.

3

COALESCE jest tym, czego możesz użyć, jeśli masz tabelę dat i po lewej stronie połączono ją. Odchodzi od lewej do prawej, aby zwrócić pierwszą wartość inną niż null. Twoja grupa wygląda trochę orzechowo, dostosowałem ją.

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 

Gdzie terminy tabeli jest ..

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

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

+0

Wypróbowałem Twoje zapytanie i nadal otrzymuję ten sam wynik. – sravis

+0

Niestety, brakowało mi bitu do utworzenia tabeli dat, to jest ważne, –

1

Jeśli zestaw wyników nie miał żadnych postów w tym okresie czasu, nie dostaniesz żadnych wyników liczyć, stąd dlaczego się nie pokazuje.

Użytkownik musiałby dołączyć do innej tabeli, która ma wszystkie miesiące roku lub wypełnić dane programowo po zwróceniu wyników. Nie mogę wymyślić innego sposobu, aby to zrobić, ale być może jest to możliwe.

Ponadto, jak powiedzieli inni, oddziel grupę przecinkami.

0

Chyba wystarczy zapytać jak to

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

przykład vb

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

następnie napisać

<%=count("totid")%> 
Powiązane problemy