Guten Tag allerseits,
ich sitze leider immernoch an dem vor ein paar Tagen bereits von mir beschriebenem Problem.
Nochmal kurz zusammengefasst geht es um folgendes Szenario:
- Es handelt um eine Suche nach Resorts
- ein Resort kann n ResortFacilities besitzen (zb Abholservice, behindertengerecht, etc..)
- ein Resort hat x Raeume
- jeder Raum hat y RoomFacilties (Aircon, Internet, etc..)
Stark vereinfacht sieht es aus wie folgt:
Anwendungsbeispiel fuer eine Suche:
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.
Das Thema mit den ResortFacilties bekomme ich ohne Probleme umgesetzt. Jedoch scheitere ich an den RoomFacilities. Ich verstehe einfach nicht, wie ich diese Logik in nur einem einzigen Statement unterbringen kann.
Meine erster Ansatz - ausgehend von den vorherigen Posts - ist wie folgt:
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
WHERE
(
SELECT DISTINCT
COUNT(room3.id)
FROM
room AS room3
WHERE
room3.resort_id = r.id
AND
room3.room_type_id IN ( 2 )
) > 1
AND
(
SELECT DISTINCT
COUNT(room2.id)
FROM
room AS room2
LEFT JOIN
mm_room_facility ON room2.id = mm_room_facility.room_id
LEFT JOIN
room_facility ON mm_room_facility.room_facility_id = room_facility.id
WHERE
room2.resort_id = r.id
AND
( room_facility_id = 1 )
GROUP BY
room2.id
HAVING COUNT(mm_room_facility.room_facility_id) = 1
) = 1
AND
(
rf.id = 7 OR rf.id = 3 OR rf.id = 2
)
GROUP BY
r.id
HAVING COUNT(resfacility.resort_facility_id) = 3
Der Trick hierbei war der Einsatz von GROUP BY, HAVING und COUNT. Klappte wunderbar, so lange ich nicht versucht habe die RoomFacilities mit einzubeziehen.
Mein aktueller Ansatz, das ganze mittels Subselects zu loesen, scheitert leider auch (scheitern heisst, ich bekomme - wie auch im ersten Beispiel - keine eintraege zurueckgeliefert).
SELECT DISTINCT
resort.id, resort.name
FROM
resort
WHERE
-- resort facilities
(
SELECT
COUNT(id)
FROM
mm_resort_facility
WHERE
mm_resort_facility.resort_id = resort.id
AND
mm_resort_facility.resort_facility_id IN (1,2,3)
) = 3
AND
-- 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
Mitterweile habe ich das dumpfe Gefuehl, dass ich da einfach nicht mehr von alleine weiterkomme. Daher waere ich wirklich sehr dankbar, wenn einer von den Fachleuten hier mal evtl. drueber schauen und mir ggfs. ein paar Ratschlaege geben koennte.
Herzlichen Dank im Voraus!
MfG
Peter
PS:
MySQL Server version: 5.0.67-community
InnoDB