SELECT b.buildingId, b.buildingName, cb.buildingLevel FROM buildings b LEFT JOIN citybuildings cb ON b.buildingId = cb.buildingId AND cb.cityId =$cityId WHERE NOT EXISTS ( SELECT 1 FROM buildingsrequirements br WHERE br.buildingId = b.buildingId AND NOT EXISTS ( SELECT 1 FROM citybuildings cb1 WHERE br.bui_buildingId=cb1.buildingId AND cb1.cityId = cb.cityId ) ) ORDER BY b.buildingName
Wydaje mi się, że przy użyciu joinów wyglądałoby to prościej.
W zapytaniu chodzi o pobranie budynków które już zostały zbudowane w danym mieście wraz z ich poziomami, oraz budynków, które wolno zbudować (wtedy poziom np. null), warunek - muszą być już zbudowane wszystkie inne budynki wymagane dla nich.
Struktura
CREATE TABLE `buildings` ( `buildingId` int(3) NOT NULL AUTO_INCREMENT, `buildingName` varchar(24) NOT NULL, PRIMARY KEY (`buildingId`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=14 ; -- -------------------------------------------------------- CREATE TABLE `buildingsrequirements` ( `buildingId` int(3) NOT NULL, `bui_buildingId` int(3) NOT NULL, KEY `FK_Relationship_2` (`bui_buildingId`), KEY `FK_Relationship_3` (`buildingId`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2; -- -------------------------------------------------------- CREATE TABLE `citybuildings` ( `cityId` int(7) NOT NULL, `buildingId` int(3) NOT NULL, `buildingLevel` tinyint(4) NOT NULL, KEY `FK_Relationship_4` (`cityId`), KEY `FK_Relationship_5` (`buildingId`)