MySQL - Tabellen verbinden, IDs zuteilen etc.

banshe

Mitglied
Hallo zusammen,

ich habe seit Jahren nichts mehr mit MySQL gemacht und möchte wieder einsteigen. Hierzu möchte ich ein kleines Projekt realisieren.


Es geht um folgendes:

Ich habe einen Artikel, bsp.: Ein Vogelhaus
Um eine Vogelhaus zu bauen, braucht es diverse Materialien, bsp.: Holz, Nägel, Farbe

Jetzt möchte ich meine Datenbank sagen "Zeig mir alles was ich mit Nägel, Farbe und Holz machen kann" und die Datenbank gibt mir "Vogelhaus" als resultat.


Momentaner Standpunkt:

Ich habe eine SQL Datenbank erstellt und zwei Tabellen gemacht.
"Artikel" - hier ist z.B. das Vogelhaus aufgelistet
"Material" - hier sind verschiedene Materialien aufgelistet bsp: Holz, Scharniere, Farbe etc.


Frage:

Wie/Wo definiere ich dass, das Vogelhaus "Holz", "Farbe" und "Nägel" braucht?
Wie mache ich eine Abfrage, die beide Tabellen verknüpft? (Ich erinnere mich an Inner Join und Outer Join, aber hab keine Ahnung mehr davon)...


Danke euch!
 
Okay... naja, das mit der Abfrage ist jetzt noch nicht sooo ein brennpunkt...

Mein Problem momentan ist der grundsätzliche Aufbau der Datenbank..

Muss ich überhaupt zwei Tabellen (Artikel und Material) machen?
Oder soll ich nur eine Tabelle machen mit dem Artikel und den Materialien zusammen (Vogelhütte / Holz / Farbe / Nägel)

Dann brauche ich jedoch eine Tabelle mit keine Ahnung wievielen Spalten, weil ich ja nicht weiss, wieviele Materialien ein Artikel maximal benötigt.

Hilfe =(
 
Tabelle1: Produkte (produkt_id, name)
Tabelle2: Materialien (material_id, name)
Tabelle3: Verbindung von beiden (produkt_id, material_id)

Das ist der einzig sinnvolle Aufbau. Natürlich macht es auch ab und zu mal Sinn es in weniger Tabellen zu stecken, aber hier bietet es sich einfach an.

Beispiel:

Produkte:
1 | Vogelhaus Bunt
2 | Hundehütte Natur (ohne Farbe)

Materialien
54 | Holz
243 | Nägel
866 | Farbe
976 | Hundenapf

Verbindung
1 | 54
1 | 243
1 | 866
2 | 54
2 | 243
2 | 976

Und jetzt alle Produkte die Farbe brauchen.
SQL:
SELECT p.produkt_id, p.name FROM produkte AS p, verbindungen AS v
WHERE v.produkt_id = p.produkt_id AND v.material_id = 866;

Jetzt kannst du z.B. später auch ohne Probleme eine weiter Tabelle "Werkzeuge" erstellen und eine Tabellen, die an gibt, welche Werkzeuge man für ein Produkt braucht. Bei dem anderen Ansatz müsste man ständig das Tabellen-Schema ändern.
 
Vielen Dank für die Hilfe..
Hat mir sehr weitergeholfen!
Soweit funktioniert das ganze nun...

Momentan hab ich noch ein kleines Verständniss problem:

Mit der Abfrage die du gepostet hast, zeigt er mir jetzt alle Artikel an, die z.B. Farbe brauchen.

Mein Ziel ist jedoch, dass er mir alle Artikel anzeigt, die ich mit den ausgewählten Meterialien herstellen kann.

Wenn ich z.B. sage "Ich habe Holz und Farbe" gibt es mir keinen Artikel aus.
Wenn ich z.B. sage "Ich habe Holz und Farbe und Nägel" gibt es mir "Vogelhütte" aus.

Funktioniert das mit der aktuellen Datenbank (die von CPoly geschriebenen)?
Ist es nur eine andere Abfrage oder muss ich die Datenbank umbauen?

Danke!
 
SQL:
#Liefert keine Ergebnis:
SELECT p.produkt_id AS pid, p.name FROM produkte AS p, verbindungen AS v
WHERE v.produkt_id = p.produkt_id AND v.material_id IN (54, 866)
GROUP BY p.produkt_id
HAVING COUNT(*)=(SELECT COUNT(*) FROM verbindungen WHERE produkt_id=pid GROUP BY produkt_id)

#Liefert Vogelhaus
SELECT p.produkt_id AS pid, p.name FROM produkte AS p, verbindungen AS v
WHERE v.produkt_id = p.produkt_id AND v.material_id IN (54, 243, 866)
GROUP BY p.produkt_id
HAVING COUNT(*)=(SELECT COUNT(*) FROM verbindungen WHERE produkt_id=pid GROUP BY produkt_id)
 
Zurück