Linuchs: mySQL: doppelte Zählung vermeiden

Moin,

ich möchte die Anzahl von Veranstaltungen pro Veranstaltungstyp anzeigen. Gezählt wird zweimal, nach alter und neuer Version.

Die Schnittmenge beider Zähler enthält Veranstaltungen doppelt. Wie kann ich die Doppelten aussondern?

Alte Zählung:

Termin-Datensätze in meinem Kalender können keinen oder einen Veranstaltungstyp im Feld typ_identhalten.

FROM        bia_termintypen typ1    -- Alle Typen (mit und ohne Events)

-- zugehoerige Termine mit Filter
LEFT JOIN   bia_termine trm1
ON          trm1.typ_id     = typ1.id
AND        (trm1.gesperrt_bis IS NULL OR trm1.gesperrt_bis <= NOW())
AND         trm1.intern_kz = 0
            -- COALESCE returns the first non-NULL value
AND        (trm1.tag >= CURDATE()                               OR COALESCE( trm1.tag_bis, trm1.tag ) >= CURDATE() )
AND        (trm1.tag <= DATE_ADD(CURDATE(), INTERVAL 366 DAY)   OR COALESCE( trm1.tag_bis, trm1.tag ) <= DATE_ADD(CURDATE(), INTERVAL 366 DAY))   -- 366 Tage Vorschau
AND         typ1.id  != 74  -- keine Schulferien-Saetze

WHERE       typ1.owner_id   = '1'
AND         typ1.loe_kz     = 0

GROUP BY    typ1.id
ORDER BY    typ1.sort

Neue Zählung:

Seit einigen Wochen können zusätzlich mehrere Typen pro Termin angekreuzt werden. Jede aktive Checkbox verursacht einen Eintrag in der Tabelle termin_typ mit den Feldern termin_id und typ_id.

FROM        bia_termintypen typ1    -- Alle Typen (mit und ohne Events)

-- Welche Termine hat dieser Typ?
LEFT JOIN   bia_termin_typ ttp1
ON          ttp1.typ_id     = typ1.id
-- Aufruf der Termine mit Filter
LEFT JOIN   bia_termine trm1
ON          trm1.id         = ttp1.termin_id
AND        (trm1.gesperrt_bis IS NULL OR trm1.gesperrt_bis <= NOW())
AND         trm1.intern_kz = 0
            -- COALESCE returns the first non-NULL value
AND        (trm1.tag >= CURDATE()                               OR COALESCE( trm1.tag_bis, trm1.tag ) >= CURDATE() )
AND        (trm1.tag <= DATE_ADD(CURDATE(), INTERVAL 366 DAY)   OR COALESCE( trm1.tag_bis, trm1.tag ) <= DATE_ADD(CURDATE(), INTERVAL 366 DAY))   -- 366 Tage Vorschau
AND         typ1.id  != 74  -- keine Schulferien-Saetze

WHERE       typ1.owner_id   = '1'
AND         typ1.loe_kz     = 0

GROUP BY    typ1.id
ORDER BY    typ1.sort

Gruß, Linuchs

  1. Bin dem Problem aus dem Weg gegangen, indem ich alle alten typ_id in die neue Form überführt habe.

    In irgend welchen Programmen wird's wohl knallen, weil das alte Feld typ_id nun typ_id_ALT heißt.

    Linuchs