mySQL: 2 Tabellen verknüpfen

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.269
Hi

ich find dazu viel infos - aber irgendwie rall ich das noch nicht so ganz :(

Ich habe 2 Tabellen:

genre:
Code:
filmid | genre
10     | Action
10     | SciFi
11     | Komödie
12     | Action
13     | SciFi

filme:
Code:
filmid | titel        | note   | viele weitere - nur die relevanten
10     | Terminator   | 7      |
11     | American Pie | 5      |
12     | Predator     | 6      |
13     | Star Wars    | 10     |


Jetzt möchte ich alle Filme mit Genre "Action" angezeigt bekommen - dazu natürlich alle weiteren Infos aus "filme"

Jetzt könnte ich das auf 2 Arten machen:

Ich lese die genre-Tabelle aus (... where genre = 'Action'), mache eine while-Schleife (... mysql_fetch_array) in php und dort lese ich die filme-Tabelle aus und mache die entsprechende Ausgabe wie ich sie haben möchte.

=> sollte einfach sein.

2. Möglichkeit ... die wo mir das mysql-Knowhow fehlt :(
Ich verknüpfe beide tabellen und schreibe eine "temporäre" neue wo ich mir dann titel & Co raus auslese.

Diese temporäre auf basis der "filme"-Tabelle hätte dann nur noch die filmid's die passend mit dem gewählten Genre aus der "genre"-Tabelle ist.

Code:
filmid | genre | Titel           | Note |
10     | Action | Terminator | - |
12     | Action | Predator    | - |

Die 1. Möglichkeit hat für mich den Nachteil das ich die nachfolgenden scripte für div. Kriterien (genre ist eine Ausgabe-Art, dann kommt nach Land, Jahr, Note > 8, Platz usw.) auch anpassen müsste. Mit der 2. Variante könnte ich einfach meine Standard "Filmausgabe"-While-Schleife fahren.

Beim verknüpfen muss ich ja AS und ggf. auch join einsetzen - aber mir ist das ganze Prinzip davon noch nicht so klar. Kann mir das einer mal näherbringe? ;) [habe mir schon viele Beispiele angeschaut aber so recht schlau ...] Hab ca. nen dutzend (teils komplett unterschiedliche; daher nicht einfach c&p und namen anpassen) Abfragen wo ich das machen muß

Gruß
 
SELECT * FROM filme, genre WHERE filme.filmid = genre.filmid AND genre.genre = 'Action'

Genaue Syntax bin ich mir nicht ganz sicher, ist schon n weilchen her dass ich das letzte mal mit MySQL gearbeitet hab.
 
Erstmal was grundlegendes vorweg:

Diese Genre-Tabelle würde man zu dem Zweck aufsetzen, um Redundanzen in den Tabellen zu vermeiden. Beispielsweise bei 2 Filmen "Action" in die Genre-Spalte zu schreiben.

Wie das jetzt bei dir gelöst ist vermeidet es aber keine Redundanz da der Primärschlüssel in der zweiten Tabelle wieder die FilmId ist. Die eigentlichen Werte stehen immer wieder komplett drin und für jeden Film extra.

Logischer wäre also eine Tabelle
Code:
renreid | genre_description
1       | Action
2       | SciFi
3       | Komödie

Entsprechend dann die Normale Tabelle
Code:
filmid | titel        | note   | genreid | viele weitere - nur die relevanten
10     | Terminator   | 7      | 1
11     | American Pie | 5      | 3
12     | Predator     | 6      | 1
13     | Star Wars    | 10     | 3

genreid in diesem Fall als Foreign-Key auf die Genre-Tabelle oben.



Über JOINs braucht man sich in Normalfall nicht großartig Gedanken machen. Das funktioniert auch wie von Anub1s beschrieben. Im SELECT alle Tabellen aus denen man Infos herausholen will angeben und in der WHERE-Klausel angeben welche Attribute sie sich "teilen".
 
Zuletzt bearbeitet:
Die Modellierung der Datenbank ist Schrott. In dem Szenario kannst du das Genre direkt als Text in ein zusätzliches Feld der Filmtabelle ablegen.

Beschäftige dich mal eine wenig mit Normalisierung bzw. der 3. Normalform. Dann verstehst du auch warum man Tabellen verjoined und wie man es tut.
 
Hi

manche Filme haben aber mehrere Genres (3-4 oder sogar mehr; ca. 2000 Filme mit 5500 Genre). Da hab ich dann aber doch Probleme wenn ich das alles in die Film-Tabelle lege. Würde dann ja doppelte Zeilen haben (bis auf Genre alles doppelt; gleiches hab ich mit Land noch mal [2000 Filme zu 3500 Länder]). Oder ich schreibe in ein Feld sowas wie "Action, SciFi, Komödie" (hab ich auch schon mal gesehen) ... nur wie werte ich das dann aus?

Mein php-Frontend hat (bzw. soll) die möglichkeit sich alle vorhandene Genres anzeigen zu lassen - dann möchte ich auf Action klicken und mir alle Action-Filme anzeigen lassen. Gleiches z.b. mit Land ("zeige mit alle Filme aus Afghanistan"). Jahr ist einfacher - In der Regel hab ich nur ein Produktionsjahr (ich hoffe es!), somit steht Jahr in der Filme-Tabelle. Ist also kein Ding sich alle Filme von 2000 anzeigen zu lassen. Dazu kommt das ich noch ne Statistik führe ;) ... wieviel Action, wieviel Filme aus Deutschland usw.

@Anub1s: scheint zu klappen ;)
edit: nu klappt es.

Gruß
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben