holly123: MySQL: tabelle: mehrere count über mehrere spalten...

hi leute,

ich habe eine tabelle mit diversen termin-einträgen. dabei gibt es termine für einzelne benutzer und oder benutzer-gruppen. ich möchte
die gesamtanzahl der termine der einzelnen benutzer und die gesamtanzahl der termine der benutzergruppen für einen tag
auflisten...

die tabelle schaut so aus:

PHP:
    id   benutzer_id  termin_id    typ  datum
    1    1            1            e    2007-01-01
    2    5            2            e    2007-01-01
    3    3            3            g    2007-01-03
    4    6            3            g    2007-01-03
    5    1            4            e    2007-01-03
    6    2            5            e    2007-01-04
    7    4            6            e    2007-01-10
    8    3            7            g    2007-01-25
    9    2            7            g    2007-01-25
    10    5            8            g    2007-01-25
    11    9            8            g    2007-01-25

typ: e.... einzelner benutzer
typ: g.... mehrere benutzer gehören zum gleichen termin

uns so solls nach dem query ausschauen:

PHP:
    id   anzahl_einzelnetermine   anzahl_gruppentermine    datum
    1    2                        0                        2007-01-01
    2    1                        1                        2007-01-03
    3    1                        0                        2007-01-04
    4    1                        0                        2007-01-10
    5    0                        2                        2007-01-25

ich habe schon mit count() und group by... probiert, aber ich versehts irgendwie nicht. bin noch nicht so versiert in mysql

bitte um hilfe!!!

lg,
holly123

  1. Hallo holly123,

    group by wird immer dann auf die weiteren Elemente angewendet, wenn Aggregatfunktionen (bspw. sum() oder count()) verwendet werden, bspw. select id, sum(geld) from xyz group by id

    versuchs mal hiermit (vielleicht gibts einen einfacheren Weg, aber der fällt mir gerade nicht ein ;)):

    SELECT g.benutzer_id, 0 AS e,count(g.g) as g, g.datum
    FROM
    (SELECT  benutzer_id, termin_id as g, datum FROM test WHERE type='g') as g
    GROUP BY g.benutzer_id, g.datum
    UNION
    SELECT e.benutzer_id, count(e.e) as e, 0 AS g, e.datum
    FROM
    (SELECT id, benutzer_id, termin_id as e, datum FROM test WHERE type='e') as e
    GROUP BY e.benutzer_id, e.datum

    1. Hi,

      versuchs mal hiermit (vielleicht gibts einen einfacheren Weg, aber der fällt mir gerade nicht ein ;)):

      SELECT g.benutzer_id, 0 AS e,count(g.g) as g, g.datum
      FROM
      (SELECT  benutzer_id, termin_id as g, datum FROM test WHERE type='g') as g
      GROUP BY g.benutzer_id, g.datum
      UNION
      SELECT e.benutzer_id, count(e.e) as e, 0 AS g, e.datum
      FROM
      (SELECT id, benutzer_id, termin_id as e, datum FROM test WHERE type='e') as e
      GROUP BY e.benutzer_id, e.datum

      seine DB ist (seines Glaubens nach) zu alt und unterstützt keine
      Subqueries (er hat diese Frage schon in einem anderen Forum gestellt).

      LG

      1. Oh, das ist nicht gut...

        Aber etwas einfacher sollte es ja auch gehen, dann sinds aber 2 Queries ;D:
        SELECT benutzer_id, count(termin_id), datum FROM test WHERE type='g' GROUP BY benutzer_id, datum ORDER BY benutzer_id
        SELECT benutzer_id, count(termin_id), datum FROM test WHERE type='e' GROUP BY benutzer_id, datum ORDER BY benutzer_id

        Hab hier auch leider gerade nur Postgres zur Hand (Büro),  daher kann ich das nicht auf mySQL checken...

  2. Hi,

    ich habe jetzt in der Charta keine Regelung zu Crosspostings gesehen,
    aber Du solltest doch zumindest erwähnen, welche Tipps Du schon anderswo
    bekommen hast und warum die Dich nicht weitergebracht haben.

    LG

  3. yo,

    SELECT benutzer_id,
           SUM(IF(typ = 'e', 1, 0)) AS Einzeltermine,
           SUM(IF(typ = 'g', 1, 0)) AS Gruppentermine,
           datum
    FROM tabelle
    GROUP BY benutzer_id, datum
    ORDER BY benutzer_id, datum

    die ORDER BY klausel ist by mysql optional und kann dort weggelassen werden, weil er schon eine sortierung durch die group by klausel durchführt.

    Ilja