butter: MySQL -> Complexe Select Anweisung

Abend,

Ich habe ein Problem, welches aus 3 Tabllen und einer Select anwesung besteht.

Tabele1:

Abteilung
   ID     |   Name
------------------------
    1     |  Ein Test
    2     |  Yahoola
    3     |  Servus
    4     |  Baum

Grund
   ID     |   Name
------------------------
    1     |  Essen
    2     |  Drinken
    3     |  Fischen

Kontaktiert

ID     |   Time         |   AbteilungID  |  GrundID
---------------------------------------------------------
    1     |  1111493949    |    1           |    1
    2     |  1111494534    |    1           |    2
    3     |  1111495663    |    1           |    2
    4     |  1111497899    |    3           |    1

So und meine Ziel ist es folgende Ausgabe zu bekommen

GrundName    |   Anzahl (Wie oft die Abteilung [1] unter dem Grund kontaktiert worden ist
---------------------------------------------------------------
  Essen        |     1
  Drinken      |     2
  Fischen      |     0

Übergen wird nur die AbteilungsID, mit der möchte ich nun rausfinden wie oft die Abteilung für jeden grund Kontakterit worden ist, wobei '0' mal auch angezeigt werden soll

SELECT Grund.Name GrundName , count(Kontaktiert.ID) Anzahl

FROM Kontaktiert,
        Grund

WHERE Kontaktiert.AbteilungID = 1
     AND Kontaktiert.GrundID = Grund.ID

GROUP BY Reason.ID";

Bekomm ich aber nicht die Gründe raus für die es keine Werte gibt,

wie kannman das anders schreiben?

  1. Hi,

    FROM Kontaktiert,
            Grund

    bitte lasse diese komischen Ticks weg, solange für sie keine Notwendigkeit besteht. Und wenn sie besteht, ändere das DB-Layout.

    wie kannman das anders schreiben?

    Beschäftige Dich mit Outer Joins.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. yo,

    wie bereits von Chetah erwähnt, hilft hier ein OUTER JOIN weiter. nur für den fall, falls du es noch nicht hinbekommen hast, hier mein vorschlag (nicht ausprobiert).

    SELECT Grund.Name, COUNT (Kontaktiert.ID) AS Anzahl
    FROM Grund LEFT JOIN Kontaktiert ON (Kontaktiert.GrundID = Grund.ID)
    WHERE Kontaktiert.AbteilungID = 1
    GROUP BY Grund.Name";

    Ilja

    1. Hi danke für dein Vorschlag,

      Das funktioniert auch so weit, bis auf das die Grund Spalten welche nicht in der Tabelle Kontaktiert verknüpft sind nicht angezeigt werden.

      1. yo,

        Das funktioniert auch so weit, bis auf das die Grund Spalten welche nicht in der Tabelle Kontaktiert verknüpft sind nicht angezeigt werden.

        ich sehe keinen grund, warum sie das nicht sollten. welches ergebnis bekommst du den mit der abfrage geliefert ?

        Ilja