Verschiedene Zeilen Zählen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Verschiedene Zeilen Zählen

    Hallo,

    ich versuche in einer Datenbankabfragen festzustellen, welcher Teil der Familie anwesend ist. Hier die Datenbankstruktur:

    Code:
    table families:
    fam_id | fam_name
    -----------------
    1      | Müller
    2      | Maier
    
    
    table status:
    name    | fam_id | status
    -----------------------
    Jens    | 1      | 0
    Sabine  | 1      | 1
    Hans    | 1      | 0
    Oliver  | 1      | 1
    Thomas  | 2      | 0
    Maria   | 2      | 1
    Steffen | 2      | 1
    Jetzt würd ich in einer Datenbankabfrage gerne alle Familen abfragen inklusive der Infomation, wie viele den Status 0 und wie viele den Status 1 haben.

    Die Ausgabe sollte dann so aussehen:

    Code:
    fam_id | fam_name | count_status_0 | count_status_1
    ---------------------------------------------------
    1      | Müller   | 2              | 2
    2      | Maier    | 1              | 2
    Habe auch schon eine erste Idee, aber die funktioniert nicht:

    PHP-Code:
    SELECT fam_idfam_nameCOUNT(s1.status) AS count_status_0COUNT(s2.status) AS count_status_1
    FROM families f
    LEFT JOIN status s1 ON 
    (s1.fam_id f.fam_id AND s1.status '0')
    LEFT JOIN status s2 ON (s2.fam_id f.fam_id AND s2.status '1')
    GROUP BY f.fam_id 
    Leider führt das nicht zum geünschten Erfolg. Kann mir jemand helfen?

  • #2
    Code:
    SELECT
        f.`fam_id`, f.`fam_name`, SUM(s.`status`) AS `anwesend`, (COUNT(*) - SUM(s.`status`)) AS `nicht_anwesend`
    FROM
        `families` f
    INNER JOIN
        `status` s ON ( s.`fam_id` = f.`fam_id` )
    GROUP BY
        f.`fam_id`, f.`fam_name`

    Kommentar


    • #3
      Super, funktioniert und die Abfrage ist auch noch sehr schnell.

      jetzt gibt es nur ein Problem. Sollte sich eine Familie noch nicht eingetragen habe. Also wenn sie nur in der ersten Tabelle "families" steht, dann fällt sie quasi aus der Abfrage raus. Kann man da noch was an der Abfrage ändern? Dass die Felder "anwesend" und "nicht anwesend" einfach NULL werden?
      Zuletzt geändert von Tarlar; 20.01.2010, 12:42.

      Kommentar


      • #4
        Hallo,

        dazu machst du aus dem Inner Join wieder einen Left Join.

        Gruß,

        Amica
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Jop, darauf bin ich dann selbst gekommen

          Hätte aber noch eine kleine Frage:

          Wie kann ich bei einer Abfrage mit einem LEFT JOIN, genau die Zeilen auswählen, bei denen es keine Übereinstimmung gibt und quasi ne NULL-Zeile aus der Join-Tabelle kommt?

          Kommentar


          • #6
            Zitat von Tarlar Beitrag anzeigen
            Wie kann ich bei einer Abfrage mit einem LEFT JOIN, genau die Zeilen auswählen, bei denen es keine Übereinstimmung gibt und quasi ne NULL-Zeile aus der Join-Tabelle kommt?
            Code:
            SELECT
                t1.id
            FROM
                tabelle1 t1
            LEFT JOIN
                tabelle2 t2 ON ( t2.id = t1.f_id )
            WHERE
                t2.id IS NULL

            Kommentar


            • #7
              Ach der Fehler war, dass ich nicht die ID-Spalte genommen habe, sondern eine Spalte die nicht als "NOT NULL" definiert ist.

              Kommentar

              Lädt...
              X