Hi,
ich entwickele ein Konferenzsystem und arbeite gerade an der Teilnehmersuche. Sie funktioniert, aber da ich nicht so der SQL Profi bin und gerne die optimale Lösung hätte, wäre es nett, wenn jemand mal draufschauen könnte, ob das noch besser geht.
Zur Datenstruktur ( in Klammern die Tabellennamen): es gibt eine beliebige Anzahl Kurse (workshops) und eine beliebige Anzahl fest definierter Termine (slots). Die Kombination (ein Kurs findet an einem Termin statt) ist eine Verfügbarkeit (workshop_availabilities). Jeder Teilnehmer (participants) kann an einer beliebigen Anzahl Kurse, also den Verfügbarkeiten, teilnehmen, die Kombination ist eine Teilnahme (workshop_participations).
1) Suche nach allen Teilnehmern, die an einer beliebigen Verfügbarkeit zu einem festen Termin teilnehmen:
2) Suche nach allen Teilnehmern, die an einer bestimmten Verfügbarkeit teilnehmen:
3) Und jetzt meine Krampf-Lösung: suche nach allen Teilnehmern, die NICHT an einer bestimmten Verfügbarkeit teilnehmen:
4) Und jetzt alles zusammen:
Meine Fragen:
- muss man bei Nr 3 wirklich eine Subquery machen?
- muss man bei Nr 4 die Tabellen wirklich mehrfach aufzählen (wsa1, wsa2, ...)?
- andere Verbesserungen, auch wenn es nur Kleinigkeiten sind?
ich entwickele ein Konferenzsystem und arbeite gerade an der Teilnehmersuche. Sie funktioniert, aber da ich nicht so der SQL Profi bin und gerne die optimale Lösung hätte, wäre es nett, wenn jemand mal draufschauen könnte, ob das noch besser geht.
Zur Datenstruktur ( in Klammern die Tabellennamen): es gibt eine beliebige Anzahl Kurse (workshops) und eine beliebige Anzahl fest definierter Termine (slots). Die Kombination (ein Kurs findet an einem Termin statt) ist eine Verfügbarkeit (workshop_availabilities). Jeder Teilnehmer (participants) kann an einer beliebigen Anzahl Kurse, also den Verfügbarkeiten, teilnehmen, die Kombination ist eine Teilnahme (workshop_participations).
1) Suche nach allen Teilnehmern, die an einer beliebigen Verfügbarkeit zu einem festen Termin teilnehmen:
Code:
SELECT * FROM `participants` AS `p`
INNER JOIN workshop_participations AS `wsp1` ON `wsp1`.`participant_id` = `p`.`id`
INNER JOIN workshop_availabilities AS `wsa1` ON `wsp1`.`workshop_availability_id` = `wsa1`.`id`
WHERE `wsa1`.`slot_id` = 1
2) Suche nach allen Teilnehmern, die an einer bestimmten Verfügbarkeit teilnehmen:
Code:
SELECT * FROM `participants` AS `p`
INNER JOIN workshop_participations AS `wsp2` ON `wsp2`.`participant_id` = `p`.`id`
INNER JOIN workshop_availabilities AS `wsa2` ON `wsp2`.`workshop_availability_id` = `wsa2`.`id
WHERE `wsa2`.`id` = 1
3) Und jetzt meine Krampf-Lösung: suche nach allen Teilnehmern, die NICHT an einer bestimmten Verfügbarkeit teilnehmen:
Code:
SELECT * FROM `participants` AS `p`
LEFT JOIN (
SELECT `wsp`.`id` AS wsp_id, `wsp`.`participant_id` AS participant_id
FROM workshop_participations AS `wsp`
INNER JOIN workshop_availabilities AS `wsa` ON `wsp`.`workshop_availability_id` = `wsa`.`id`
WHERE `wsa`.`slot_id` = 4
) AS `wsp4` ON (`wsp4`.`participant_id` = `p`.`id`)
WHERE ISNULL(`wsp4`.`wsp_id`)
4) Und jetzt alles zusammen:
Code:
SELECT * FROM `participants` AS `p`
INNER JOIN workshop_participations AS `wsp1` ON `wsp1`.`participant_id` = `p`.`id`
INNER JOIN workshop_availabilities AS `wsa1` ON `wsp1`.`workshop_availability_id` = `wsa1`.`id`
INNER JOIN workshop_participations AS `wsp2` ON `wsp2`.`participant_id` = `p`.`id`
INNER JOIN workshop_availabilities AS `wsa2` ON `wsp2`.`workshop_availability_id` = `wsa2`.`id`
LEFT JOIN (
SELECT `wsp`.`id` AS wsp_id, `wsp`.`participant_id` AS participant_id
FROM workshop_participations AS `wsp`
INNER JOIN workshop_availabilities AS `wsa` ON `wsp`.`workshop_availability_id` = `wsa`.`id`
WHERE `wsa`.`slot_id` = 4
) AS `wsp4` ON (`wsp4`.`participant_id` = `p`.`id`)
WHERE
`wsa1`.`slot_id` = 1
AND `wsa2`.`id` = 1
AND ISNULL(`wsp4`.`wsp_id`)
Meine Fragen:
- muss man bei Nr 3 wirklich eine Subquery machen?
- muss man bei Nr 4 die Tabellen wirklich mehrfach aufzählen (wsa1, wsa2, ...)?
- andere Verbesserungen, auch wenn es nur Kleinigkeiten sind?
Zuletzt bearbeitet: