Hi!
Vorab: Deine Abfragen zeigen, dass du auch noch ein Aliasnamenfindungsproblem hast. Versuch ein konsistentes Schema zu finden, sonst sieht man (du eingeschlossen) irgendwann nicht mehr durch. Den Alias verwendet man häufig, um Tipp- und Lesearbeit zu sparen, weswegen er zwar kurz aber eindeutig sein soll. Beispielsweise: Resort und Room fängt beides mit R an. Zur Unterscheidung könntest du re und ro als Alias nehmen, für die jeweiligen Facility-Verknüpfungstabellen mref und mrof. (Die Tabellen ohne mm brauchst du in der Abfrage nicht, die hießen ansonten ref oder rof.)
Der Benutzer kann nun nach Resorts suchen, welche die ResortFacilities x und y und z besitzen sollen. Zudem sollen nur Resorts gelistet werden, von denen mindestens ein Raum die RoomFacilties a und b und c besitzt.
Du benötigst also erst einmal die Ergebnismenge für alle Resorts, die die entsprechenden Facilitys haben.
SELECT ID_Resort
FROM Resort re
JOIN MM_Resort_Facility mref ON mref.ID_Resort = re.ID
WHERE mref.ID_Resort_Facility IN (1,2) -- IDs der bereits anderweitig gewählten Facilitys
GROUP BY mref.ID_Resort
HAVING COUNT(*) = 2 -- Anzahl der o.a. Facilitys
Diese Ergebnismenge muss weiter eingeschränkt werden. Wir brauchen gemäß dem gleichen Schema alle Räume mit bestimmten Facilitys ...
SELECT ID_Resort, ID
FROM Room ro
JOIN MM_Room_Facility mrof ON mrof.ID_Room = ro.ID
WHERE mrof.ID_Room_Facility IN (1,6)
GROUP BY mrof.ID_Resort, ro.ID
HAVING COUNT(*) = 2
... und letztlich davon nur die Resorts in denen sie sich befinden.
SELECT DISTINCT ID_Resort FROM Room ro
...
Zusammengebaut ergibt sich:
SELECT ID, Name
FROM
(
SELECT re.ID, re.Name
FROM Resort re
JOIN MM_Resort_Facility mref ON mref.ID_Resort = re.ID
WHERE mref.ID_Resort_Facility IN (1,2)
GROUP BY re.ID, re.Name
HAVING COUNT(*) = 2
) AS resorts
WHERE resorts.ID_Resort IN (
(SELECT DISTINCT ro.ID_Resort
FROM Room ro
JOIN MM_Room_Facility mrof ON mrof.ID_Room = ro.ID
WHERE mrof.ID_Room_Facility IN (1, 6)
GROUP BY mrof.ID_Resort, ro.ID
HAVING COUNT(*) = 2
))
Die Funktionsweise der einzelnen Statements sollte man in Einzeltests sicherstellen, bevor man sie zusammenbaut und dann den Fehler in einem großen Haufen suchen muss.
[code lang=sql]
SELECT DISTINCT
r.id, r.name
FROM
resort AS r
LEFT JOIN
mm_resort_facility AS resfacility ON r.id = resfacility.resort_id
LEFT JOIN
resort_facility as rf ON resfacility.resort_facility_id = rf.id
Die Resort-Facility-Tabelle brauchst du nicht - wie du gemäß dem folgenden Statement vermutlich schon selbst erkannt hast - denn du brauchst nur die Facility-IDs für die WHERE-Bedingung und diese IDs sind bereits in der Verknüpfungstabelle (mm_...) enthalten.
SELECT DISTINCT COUNT(room3.id)
Der Trick hierbei war der Einsatz von GROUP BY, HAVING und COUNT. Klappte wunderbar, so lange ich nicht versucht habe die RoomFacilities mit einzubeziehen.
Bei dem DISTINCT COUNT(room3.id) sieht mir das eher nach Zufall aus, aber ich analysier das mal nicht weiter.
Mein aktueller Ansatz [...]
WHERE
-- resort facilities
(
SELECT
COUNT(id)
FROM
mm_resort_facility
[...]
) = 3
Was sagen denn die Ergebnisse der Subselects? Führten sie dich deiner Meinung nach in Richtung Ziel? Die Anzahl ist eigentlich nur für das Finden der passenden Datensätze interessant, ansonsten willst du doch eher die IDs selbst wissen.
Lo!