Benjamin: Anzahl Datensätze pro Monat ausgeben

Hallo,

Ich habe eine Tabelle, in der Artikel gespeichert sind. Nun möchte ich eine kleine Statistik machen.

Und zwar möchte ich schauen, wie oft ein Suchbegriff innerhalb eines Jahres über die Monate in den Artikel vorgekommen ist.

Mit folgender Abfrage geht das auch:

SELECT count(id) as TREFFER,text,DATE_FORMAT(date, '%y%m') AS Monat FROM blogs WHERE MATCH (text) AGAINST('"yahoo"' IN BOOLEAN MODE) AND date > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 YEAR) GROUP BY Monat;

MONAT   | TEXT | TREFFER
--------------------
2008-10 | ...  | 2
2008-09 | ...  | 12
2008-08 | ...  | 6
2008-07 | ...  | 1
2008-06 | ...  | 66

Jetzt hab ich aber das Problem, dass Monate, in denen keine Treffer gefunden wurde, nicht ausgegeben werden. Da sollte einfach ein "0" als Treffer kommen, der Monat soll trotzdem ausgegeben werden.

Weiss jemand Rat?

Danke!

  1. Da sollte einfach ein "0" als Treffer kommen, der Monat soll trotzdem ausgegeben werden.

    ich hab das grade ausprobiert (mysql):
    SELECT count(id) AS anzahl FROM tabelle WHERE 0 = 1
    liefert erwartungsgemäß folgendes:

    anzahl
    ------
    0

    ohne der einschränkung (0 = 1) erhalte ich mit meiner testtabelle

    anzahl
    ------
    32

  2. echo $begrüßung;

    Jetzt hab ich aber das Problem, dass Monate, in denen keine Treffer gefunden wurde, nicht ausgegeben werden. Da sollte einfach ein "0" als Treffer kommen, der Monat soll trotzdem ausgegeben werden.

    Ein DBMS ist ein System zum Speichern von Daten. Die Erzeugung von Daten ist nicht seine Aufgabe. Es kann im Normalfall nur die Daten ausgeben, die es hat. Nun wirst du sagen, dass es ja Daten in dem Monat gibt, nur keine zu diesem Treffer. Keine Treffer aufgrund von Filterbedingungen ist aber das gleiche wie keine Treffer aufgrund nicht vorhandener Daten. Du könntest vielleicht mit DISTINCT eine Abfrage erstellen, die dir einen Datensatz pro Monat erzeugt, die dann Left-Joinen mit den gefilterten, gruppierten und aggregierten Trefferdaten und hättest zumindest so NULL-Ergebnisse für Monate ohne Treffer, doch wenn in dem Monat gar keiner gesucht hat, versagt das auch.

    echo "$verabschiedung $name";

    1. Ein DBMS ist ein System zum Speichern von Daten. Die Erzeugung von Daten ist nicht seine Aufgabe.

      das nicht - aber man kann mit sql auch wunderbar daten "erzeugen" ;)

      1. echo $begrüßung;

        Ein DBMS ist ein System zum Speichern von Daten. Die Erzeugung von Daten ist nicht seine Aufgabe.
        das nicht - aber man kann mit sql auch wunderbar daten "erzeugen" ;)

        Du meinst INSERT und Konsorten? Damit erzeugt man keine Daten, man trägt sie nur in das DBMS ein. Auf alle Fälle kann es nicht selbständig Lücken füllen. Oder dachtest du an was anderes?

        echo "$verabschiedung $name";

        1. Du meinst INSERT und Konsorten? Damit erzeugt man keine Daten, man trägt sie nur in das DBMS ein.

          nein, das meinte ich nicht

          Auf alle Fälle kann es nicht selbständig Lücken füllen. Oder dachtest du an was anderes?

          nein, ich dachte da an das einfachste select-beispiel aus der mysql-doku:
          http://dev.mysql.com/doc/refman/5.1/de/select.html
          "SELECT kann auch verwendet werden, um Datensätze abzurufen, die ohne Referenzierung einer Tabelle berechnet wurden."

          also simpel SELECT 1+1 - das liefert daten, die eigentlich nicht da sind bzw in keiner tabelle hinterlegt sind - erzeugt sie also gewissermaßen

          1. echo $begrüßung;

            http://dev.mysql.com/doc/refman/5.1/de/select.html
            "SELECT kann auch verwendet werden, um Datensätze abzurufen, die ohne Referenzierung einer Tabelle berechnet wurden."

            <pingelig>Datensätze? - einen Datensatz!</pingelig>

            also simpel SELECT 1+1 - das liefert daten, die eigentlich nicht da sind bzw in keiner tabelle hinterlegt sind - erzeugt sie also gewissermaßen

            Damit berechnest du aus vorgegebenen Werten neue. Das ist keine Erzeugung (aus dem Nichts) sondern nur eine Umformung. Du bekommst damit einen einzelnen Datensatz, aber immer noch keine Auflistung der Monate eines Jahres beispielsweise. Da müsstest du schon schwerere Geschütze à la Stored Procedure auffahren, um Berechenbares zu berechnen.

            echo "$verabschiedung $name";

  3. Evtl. kann Dir der Begriff "outer join" weiterhelfen.

  4. yo,

    Jetzt hab ich aber das Problem, dass Monate, in denen keine Treffer gefunden wurde, nicht ausgegeben werden. Da sollte einfach ein "0" als Treffer kommen, der Monat soll trotzdem ausgegeben werden.

    zu dem was dedlfix bereits gesagt hat, dass du keine daten aus der datenbank bekommst, für die es auch keine information gibt, kann deine abfrage unabhängig von dem problem so nichts funktionieren. jedes anderes dbms ausser mysql würde dir bei dieser abfrage eine fehlermeldung ausgeben und das zurecht. die spalte text ist weder aggregiert noch gruppiert.

    man könnten einen anderen weg beschreiten, in aller regel haben dbms programmierfähigkeiten in oracle wäre das zum beispiel PL/SQL. keine ahnung, wie die unter mysql heisst. dabei könnte man in einer schleife die Monate hochzählen.

    Ilja