Peter Nack: Subselect, Havin, Count, Join... ich weisz es nicht ;-(

Beitrag lesen

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:

DBSchema

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