[MySQL 4] Welcher Tabellentyp wäre hier sinnvoll?

Paula

Erfahrenes Mitglied
Hallo zusammen,

ich sammel DVDs und haben mir zur besseren Übersicht ein Archiv mit php gebastelt. Dazu habe ich jeden Film in mehrere Kategorieren eingeteilt. Derzeit sieht meine Struktur wie folgt aus:
SQL:
CREATE TABLE `dvd` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(128) NOT NULL default '',
  `genre` varchar(32) NOT NULL default '',
  `imdb` varchar(64) NOT NULL default '',
  `imdb_rating` char(3) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

CREATE TABLE `dvd_genre` (
  `gid` int(10) NOT NULL auto_increment,
  `genre` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`gid`)
) TYPE=MyISAM;
Ich habe auch eine Suche eingebaut und zwar möchte ich z.B. nur nach einem gewissen Genre suchen. Ich suche nach Action, welches die ID 1 hat. Derzeit sieht meine Abfrage so aus:
SQL:
SELECT id, name, genre, imdb, imdb_rating
FROM dvd
WHERE genre LIKE '%1%'
ORDER BY name ASC
In der Tabelle wird ein Film mit seinen Genre so gespeichert:
Code:
1_7_13
Entsprechend werden mit meiner Suche auch alle Filme mit 11, 12, 13 usw. angezeigt. Wie kann ich das nun ausmerzen? Gibt es einen bestimmten Tabellentyp dafür, der auch variabel eingesetzt werden kann? ENUM scheint mir nicht geeignet zu sein. Oder muss ich einfach nur die Eingabe in die Tabelle ändern:
Code:
_1_7_13_
Und die Suche wäre nun nach _1_.

Was könnt ihr empfehlen?


Danke und Gruß
 
Ich würde dir empfehle eine neue Tabelle zu machen in welcher du die Assoziation zwischen Film und genre ablegst. Zusammengebaute Strings sind da keine gute Idee.

SQL:
CREATE TABLE `dvd_to_genre` (
  `dvdid` int(10) NOT NULL,
  `gid` int(10) NOT NULL,
  PRIMARY KEY  (`dvdid`,`gid`)
) TYPE=MyISAM;

Dann kannst du zu jedem Film einfach mehrere Genres speichern und änderst deine Abfrage zu:
SQL:
SELECT d.id, d.name, g.genre, d.imdb, d.imdb_rating
FROM dvd d 
  INNER JOIN dvd_to_genre dg ON d.id = dg.dvdid 
  INNER JOIN dvd_genre g ON dg.gid = g.gid
WHERE genre = "Action"
ORDER BY name ASC
 
Ein Problem tut sich bei mir gerade auf, und zwar möchte ich gerne Filme suchen, die zu der Kategorie 1 UND zur Kategorie 2 gehört. Ich krieg einfach kein Ergebnis hin. Mit ODER ist es sehr einfach, aber UND krieg ich einfach nicht hin. Kann mir bitte jemand einen Tipp geben?
 
Hm, bereits länger drüber nachgedacht, doch jede Lösung, die mir auf die Schnell einfällt, funktioniert bei näherem Nachdenken nicht. Daher glaube ich fast, daß es eine "schnelle Lösung" zu dem Problem nicht gibt.

War schon eifrig dabei, eine Lösung hier einzutippen, bis mir auffiel, daß auch das gar nicht geht!!

Von daher scheint mir nur die Möglichkeit zu bleiben, die Abfrage eben mit der ODER-Verknüpfung auszuführen und das Ergebnis manuell oder im Programm auszuwerten!

Ansonsten werde ich weiter ein Auge auf diesen Thread haben, da mich eine eventuelle Lösung, falls sie existiert, ebenfalls interessieren würde.
 
Sowas vielleicht?

SQL:
select COUNT(d.name) cnt, d.id, d.name, d.imdb, d.imdb_rating
from ((dvd d join dvd_to_genre dg on((d.id = dg.dvdid))) join dvd_genre g on((dg.gid = g.gid)))
WHERE (g.genre = "Action" OR g.genre ="Comedy")
GROUP by d.name
HAVING cnt = 2;

Man muss nur daran denken den cnt anzupassen nach der Anzahl der Genres nach denen man sucht.
 
Zurück