MySQL: tabelle: mehrere count über mehrere spalten...
holly123
- datenbank
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
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
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
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...
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
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