mySQL: doppelte Zählung vermeiden
Linuchs
- datenbank
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_id
enthalten.
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
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