Knifflige Satzzählung
Kalle_B
- datenbank
Hallo,
Besucher einer Messe haben Kontaktwünsche zu Ausstellern. Manche Besucher bilden eine Besuchergruppe.
Jetzt sind die Kontaktwünsche zu zählen, Gruppen aber nur einmal. Hier SQL:
SELECT
gzb1.gruppen_id gruppe
,kon1.besucher_id besucher
FROM tm_kontakte kon1
LEFT JOIN tm_gruppen_besucher gzb1
ON (gzb1.adress_id=kon1.besucher_id)
WHERE kon1.aussteller_id=3413
AND (kon1.prio_1=1 OR kon1.prio_2=1)
ORDER BY gzb1.gruppen_id, kon1.besucher_id
und die Ausgabe:
gruppe besucher
------ --------
NULL 3830
NULL 3874
NULL 3948
NULL 3949
NULL 3969
338 3589
338 3590
373 3753
Das Ergebnis der Zählung soll 7 sein.
LG Kalle
Habe das mal zerlegt in Besucher mit Gruppe NULL und Anzahl Gruppen:
SELECT
count(*)
FROM tm_kontakte kon1
LEFT JOIN tm_gruppen_besucher gzb1
ON (gzb1.adress_id=kon1.besucher_id)
WHERE kon1.aussteller_id=3413
AND (kon1.prio_1=1 OR kon1.prio_2=1)
AND gzb1.gruppen_id IS NULL
SELECT
count(DISTINCT gzb1.gruppen_id)
FROM tm_kontakte kon1
LEFT JOIN tm_gruppen_besucher gzb1
ON (gzb1.adress_id=kon1.besucher_id)
WHERE kon1.aussteller_id=3413
AND (kon1.prio_1=1 OR kon1.prio_2=1)
AND gzb1.gruppen_id IS NOT NULL
Schlecht ist, dass das zwei Abfragen sind.
yo,
irgendwie kommt mir dieses messe-datendesign doch bekannt vor.....
deine lösung ist recht trivial, du musst nur verzweigen:
SELECT COUNT(DISTINCT gruppen_id) +
COUNT(DISTINCT IF(gruppen_id IS NULL, besucher_id, NULL))
FROM ....
Ilja
Hallo, Illja,
irgendwie kommt mir dieses messe-datendesign doch bekannt vor.....
Joop, habe ich jedes Jahr wieder auf dem Tisch.
Bin heute wg. eines hartnäckigen Fehlers nicht so gut drauf. Habe ich das so richtig verstanden:
SELECT COUNT(DISTINCT gruppen_id) +
jede Gruppe einmal, aber nicht die Gruppe NULL
COUNT(DISTINCT IF(gruppen_id IS NULL, besucher_id, NULL))
wandelt die Gruppe NULL in einen anderen, immer unterschiedlichen Wert (z.B. besucher_id), macht alle anderen Gruppen zu NULL, die damit nicht gezählt werden.
So richtig?
Die Ergebnisse scheinen zu stimmen ...
Kalle
yo,
SELECT COUNT(DISTINCT gruppen_id) +
jede Gruppe einmal, aber nicht die Gruppe NULL
genau, agregat-funktionen zählen keine NULL Werte.
COUNT(DISTINCT IF(gruppen_id IS NULL, besucher_id, NULL))
wandelt die Gruppe NULL in einen anderen, immer unterschiedlichen Wert (z.B. besucher_id), macht alle anderen Gruppen zu NULL, die damit nicht gezählt werden.
einfacher gesagt, wenn die gruppenspalte einen NULL wert hat, dann zähle die besucherspalte.
Ilja