Kalle_B: Knifflige Satzzählung

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

  1. Habe das mal zerlegt in Besucher mit Gruppe NULL und Anzahl Gruppen:

    KONTAKTSAETZE FUER AUSSTELLER DEISTER - BESUCHER GRUPPE NULL

    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

    KONTAKTSAETZE FUER AUSSTELLER DEISTER - BESUCHER GRUPPEN

    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.

    1. 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

      1. 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

        1. 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