Hi!
Ersetze:
mm_room_facility.room_id IN (SELECT id FROM room WHERE room.resort_id = resort.id )
durch
mm_room_facility.room_id = resort.id
Jetzt muss ich doch noch mal nachfragen:
Wieso funktioniert ueberhaupt room_id = resort.id ?
Es funktioniert nicht. Vermutlich ist das Ergebnis zufällig richtig. Probier es mit mal mit zwei Fällen, bei denen einer was finden muss und der andere nicht darf.
Ich hab grad nochmal über deinen ursprünglichen Versuch nachgedacht. Das hatte ich zugunsten einer eigenen Lösungsfindung nämlich nicht. Ohne die Resort-Facilitys sieht die Abfrage so aus:
SELECT DISTINCT resort.id, resort.name
FROM resort
WHERE -- room facilities
(
SELECT COUNT(id)
FROM mm_room_facility
WHERE mm_room_facility.room_id IN (SELECT id FROM room WHERE room.resort_id = resort.id)
AND mm_room_facility.room_facility_id IN (1,2,4)
) = 3
Die erste WHERE-Bedingung findet in der mm_room_facility-Verknüpfungstabelle genau einen Raum-Eintrag. Derer gibt es mehrere, je nach Anzahl der darin enthaltenen Facilitys. Dieser eine Raum-Eintrag hat genau eine Facility. Raum 1 hat beispielsweise Internet => Treffer. Der nächste Datensatz ergibt Raum 2 mit Aircon => noch ein Treffer. Und so weiter. Du findest also die Anzahl der Datensätze, die jeweils eine der Facilitys im jeweiligen Resort enthält, nicht aber die Räume, die alle gesuchten gleichzeitig enthalten.
Lo!