2012-05-29 23 views
5

Grafik gösterim için buna ihtiyacım var. Temelde i zorunda:MySQL sonuç kümesinde "sahte" satır oluşturmanın bir yolu var mı?

  1. tarihleri ​​ile bir dizi alma, zaman parçası olmadan tarihe göre tüm gönderilen SMS seç/çiftleri gün-gün sayar;
  2. "Sahte" satırları, günlüğümde kayıtsız günler ekleyerek, tüm tarihleri ​​"boşlukları" sıfırlarla doldurur.

örneği sonucu ve ilgili tablo (burada basitleştirilmiş) olacaktır: Bunu yaparken ya da ben el PHP diziler ile oynayan yapmalıyım için herhangi bir SQL komutu

array(
    '2012-05-26 00:00:00' => 1, 
    '2012-05-27 00:00:00' => 0, // Fake added row 
    '2012-05-28 00:00:00' => 2, 
) 

+----------------+----------------------+ 
| Table SMS | id | sent_at    | 
+----------------+----------------------+ 
|   | 1 | 2012-05-26 21:58:41 | 
+----------------+----------------------+ 
|   | 2 | 2012-05-28 22:19:21 | 
+----------------+----------------------+ 
|   | 3 | 2012-05-28 02:19:21 | 
+----------------+----------------------+ 

var mı?

+1

Bunun arkasındaki mantık ne olurdu? Bazı charting kütüphanelerinde –

+0

@ ColeJohnson ile bir zaman çizelgesi (x ekseni) ve değerler (y ekseni) belirtmeniz gerekir. Sadece gönderilen SMS'leri depoladığımdan tarih aralıklarını doldurmam gerekiyor. – gremo

+0

Bunun için ne yaptığım, diziyi oluşturan while döngüsündedir, tarihi bir tarih aralığından sonraki tarih olup olmadığını kontrol edin ve gerektiği şekilde ekleyin. –

cevap

4

Bir UNION Bildirimi ben karşı katılmak için özel bir tablo oluşturma önerisi

Düzenlendi

SELECT 
    sent_at, 
    Count(*) 
FROM (Select 
     id, 
     DATE(sent_at) as sent_at 
     FROM TableName 
     Group by Date(sent_at) 
     UNION ALL 
     Select 
     '0' as id, 
     DATE('2012-05-27') as sent_at) derived_table 
Group By sent_at 

kullanabilirsiniz. Şimdi sorguluyorsunuz aralıklar içinde tüm tarih değerleri ile bu tabloyu doldurmak

CREATE TABLE DateTable ( DateValue DateTime, Year Int, Month Int, Day Int) 

sorgulamak için bir datetable ait

Oluşturma. Geçerli bir tarihle bu tabloya kolayca katılabilirsiniz. Var olan ve olmayan Tarihler için bir araya getirmenize izin verme.

+2

Yanlış yapmam durumunda düzeltin, ancak bu sonuç kümesine yalnızca bir satır ekler. Tüm tarihler arasında "boşlukları" doldurmalıyım. – gremo

+1

@gremo Belirli tarihlerin tamamını saymak istiyorsanız, eklediğiniz "sahte satırlar" içeren türetilmiş bir tablo kullanmanız gerekecektir (boşlukları oluşturan). Boşlukların dinamik olarak doldurulmasını istiyorsanız, kendiniz için bir tarih tablosu oluşturmanızı öneririz. Bu, belirli bir zaman dilimi için tüm tarihleri ​​içerecektir. Sonra eksik tarihleri ​​almak için bu tabloya katılın. –

1

Evet, bu her seferinde

DROP PROCEDURE IF EXISTS `Example`; 
DELIMITER $$ 

CREATE PROCEDURE `Example` (
    $StartDate DATE, 
    $EndDate DATE 
    ) 
BEGIN 

    DECLARE $curDay DATE; 
    SET $StartDate = IFNULL($StartDate,'2000-01-01'); 
    SET $curDay = $StartDate; 


    DROP TEMPORARY TABLE IF EXISTS `Day`; 
    CREATE TEMPORARY TABLE `Day`(
     `Date` DATE 
    ); 

    DaysLoop:LOOP 

     INSERT INTO 
      `Day`(`Date`) 
     SELECT 
      $curDay 
     ; 

     SET $curDay = $curDay + INTERVAL 1 DAY; 

     IF 
      $curDay >= $EndDate OR $curDay >= NOW() 
     THEN 
      LEAVE DaysLoop; 
     END IF; 

    END LOOP DaysLoop; 

    SELECT 
     D.Date, 
     COUNT(S.id) 
    FROM 
     `Day` AS D 
    LEFT JOIN 
     `SMS` AS S 
     ON D.Date = DATE(S.sent_at) 
    GROUP BY 
     D.Date 
    ORDER BY 
     D.Date 
    ; 

END $$ 

DELIMITER ; 

CALL Example('2012-01-01','2012-05-01'); 

Sadece komut dosyaları ve etajer oluşturmak emin sürüm kontrolü yapmak, kullanmak ve raporlar için saklanan prosedürleri öneririm.

+0

Oh ve 'group by''a sahip olmak zorunda değilsiniz, ya da DAY_HOUR vb. Gruplara göre gruplandırılabilir. – KCD

İlgili konular