2011-05-13 34 views
8

Belirli bir süre zarfında günlük olarak yazılan blog gönderilerinin sayısını döndürmek için bir sorgu yazıyorum. Sorunum, belirli bir gün için bir blogun kaydı olmadığında ortaya çıkar. Sorgumla, o günün sonucu tamamen atlandı. herhangi yazısı yok çünkü 2011-01-03 eksik olduğunuMySQL GROUP BY TARİHÇE - satır yokken sonuçların nasıl döndürüleceği

count | date 
_________________ 
2  | 2011-01-01 
5  | 2011-01-02 
1  | 2011-01-04 

Uyarı:

SELECT DATE(`posted`), COUNT(`id`) 
    FROM `blogs` WHERE `status` = 'active' 
    && `posted` BETWEEN `2011-01-01` AND `2011-05-01` 
    GROUP BY DATE(`posted`) 

Bu benzer bir şey verir:

İşte benim sorgu var.

O günleri 0 gönderiyle göstermek için nasıl alabilirim?

cevap

6
Sen üzerinde sorgulamak için gidiyoruz tüm tarihleri ​​içeren bir tablo var ve çizgisinde bir şey yapmak gerekiyordu

...

SELECT DATE(D.`thedate`), COUNT(`id`) 
FROM `datetable` D 
LEFT JOIN `blogs` B 
ON B.`posted` = D.`thedate` 
WHERE `status` = 'active'  
&& D.`thedate` BETWEEN `2011-01-01` AND `2011-05-01`  
GROUP BY DATE(D.`thedate`) 
+0

Bunu dinamik bir şekilde nasıl ele alırdım? Güncel istatistiklere bakmak istiyorum ve rastgele tarih aralıkları seçebilmek istiyorum. – johnnietheblack

+0

@johnnietheblack - tarih tablonuzun tüm olası sorguları kapsayacak kadar geniş bir aralık içerdiğinden emin olun - çünkü tarih tablosunda 1900'den 2100'e kadar tüm tarihler varsa (örneğin - bit overkill) gerçekten önemli değil - sadece bu tablodaki tarih sütunu endekslediğinizden emin olun! –

0

tarihleri ​​içeren bir tablo oluşturmak için (http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#95):

-- Create a dummy view with 3 rows 
create or replace view v3 as select 1 n union all select 1 union all select 1; 
-- create a second dummy view with 10 rows 
-- By making joins with this view, you can create 100, 1000, ... rows 
create or replace view v as select 1 n from v3 a, v3 b union all select 1; 
-- counter 
set @n = 0; 
-- create date table 
drop table if exists datetable; 
create table datetable(thedate date primary key); 
-- populate from start date 
insert into datetable select cast('1970-1-1' + interval @n:[email protected]+1 day as date) as thedate 
from v a, v b, v c, v d, v e, v;