2012-05-29 2 views
5

Ich brauche das für Diagrammzwecke. Grundsätzlich muss ich:Gibt es eine Möglichkeit, "falsche" Zeilen in der MySQL-Ergebnismenge zu generieren?

  1. Wählen Sie alle gesendeten SMS nach Datum ohne Zeit Teil, erhalten ein Array mit Datumsangaben/zählt Paare Tag für Tag;
  2. Fügen Sie "falsche" Zeilen für Tage ohne Datensatz in meiner Tabelle hinzu, die alle Daten "Lücken" mit Nullen füllt.

Ein Beispiel Ergebnis und entsprechende Tabelle (hier vereinfacht) wäre:

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

Gibt es einen SQL-Befehl, dies zu tun oder sollte ich mit PHP Arrays Sie spielen manuell?

+1

Was wäre der Grund dafür? –

+0

@ColeJohnson In einigen Diagrammbibliotheken müssen Sie Zeitstempel (x-Achse) und Werte (y-Achse) angeben, um z. B. ein Liniendiagramm zu erhalten. Da ich nur gesendete SMS speichere, muss ich Datenlücken füllen. – gremo

+0

was ich dafür tun, ist in der While-Schleife, die das Array erstellt, überprüfen Sie das Datum ist der nächste aus einem Array von Datumsbereichen, und fügen Sie wie erforderlich. –

Antwort

4

können Sie eine UNION Statement

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 

Ich schlug vor, Edited verwenden einen speziellen Tisch gegen beitreten zu schaffen.

Schaffung eines datetable für

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

nun diese Tabelle mit allen Datumswerte innerhalb der Bereiche füllen Sie abfragen. Sie können sich problemlos mit jedem gültigen Datum an dieser Tabelle anmelden. Ermöglichen, dass Sie nach Daten gruppieren, die existieren und nicht existieren.

+2

Korrigieren Sie mich, wenn ich falsch liege, aber dies würde nur eine Zeile zum Ergebnissatz hinzufügen. Ich muss "Lücken" zwischen allen Daten füllen. – gremo

+1

@gremo Wenn Sie alle spezifischen Daten zählen möchten, müssen Sie eine abgeleitete Tabelle mit den "falschen Zeilen" verwenden, die Sie hinzugefügt haben (die die Lücken ausmachen). Wenn Sie die Lücken dynamisch füllen möchten, schlage ich vor, dass Sie eine Datumstabelle für sich selbst erstellen, die alle Daten für einen bestimmten Zeitraum enthält. Dann schließe dich dieser Tabelle an, um die fehlenden Daten zu erhalten. –

1

Ja, ich habe die ganze Zeit

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'); 

Ich benutze und gespeicherte Prozeduren für Berichte empfehlen, nur sicher, dass Sie die Versionskontrolle machen die Skripte und so weiter erstellen.

+0

Oh, und Sie müssen nicht die 'Gruppe von' haben, oder es kann durch DAY_HOUR etc – KCD

Verwandte Themen