Hi Leute,
ich habe folgende Tabellen (vereinfacht):
Wenn ich jetzt alle Filme selektieren möchte, denen Genre 1 oder 2 zugeordnet ist, so ist das relativ einfach:
Mein Problem ist jetzt eine Abfrage, bei der beide Genres vorhanden sein müssen, also AND-verknüpft.
funktioniert natürlich nicht.
Da die Query dynamisch mit PHP generiert wird, habe ich mir einen Mehrfachjoin (je nach übergebene Suchparameter) überlegt, der auch funktioniert:
Bei diesen Mehrfachjoins wird aber erstmal das Kreuzprodukt gebildet (zumindest, wenn ich das WHERE testweise weglasse) und daher mache ich mir Gedanken über die Performance. Das Beispiel ist bewusst trivial gehalten, in Wirklichkeit müssen auf diese Art mehrere Tabellen abgefragt werden und dann halt noch je nach Suchparameter die zusätzlichen Mehrfachjoins - das kann so nicht gut sein.
Hat jemand eine bessere Lösung für die Abfrage?
ich habe folgende Tabellen (vereinfacht):
Code:
CREATE TABLE `Film` ( `ID` int(10) unsigned NOT NULL auto_increment, `Titel` varchar(45) collate latin1_german1_ci NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; INSERT INTO `Film` (`ID`,`Titel`) VALUES (1,'Titel 1'), (2,'Titel 2'), (3,'Titel 3'); CREATE TABLE `Film_Genre` ( `ID` int(10) unsigned NOT NULL auto_increment, `FilmID` int(10) unsigned NOT NULL, `GenreID` varchar(45) collate latin1_german1_ci NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; INSERT INTO `Film_Genre` (`ID`,`FilmID`,`GenreID`) VALUES (1,1,'3'), (2,2,'1'), (3,2,'2');
Code:
SELECT * FROM Film F INNER JOIN Film_Genre FG ON F.ID = FG.FilmID WHERE FG.GenreID = 1 OR FG.GenreID = 2;
Code:
WHERE FG.GenreID = 1 AND FG.GenreID = 2
Da die Query dynamisch mit PHP generiert wird, habe ich mir einen Mehrfachjoin (je nach übergebene Suchparameter) überlegt, der auch funktioniert:
Code:
SELECT * FROM Film F INNER JOIN Film_Genre FG1 ON F.ID = FG1.FilmID INNER JOIN Film_Genre FG2 ON F.ID = FG2.FilmID WHERE FG1.GenreID = 1 AND FG2.GenreID = 2;
Hat jemand eine bessere Lösung für die Abfrage?
Kommentar