MySQL - verzwickte Abfrage über mehrere Tabellen
Ferris
- datenbank
Hallo!
Also wie der Titel verrät, hab ich ein Problem mit einer Abfrage un komm einfach nicht mehr weiter. Hoffentlich könnt ihr mir helfen.
Zunächst meine Tabellenstrukturen
table.COLORS
┌▬▬▬▬┬▬▬▬▬▬▬▬▬▬▬▬┐
│ id │ colorname │
├▬▬▬▬┼▬▬▬▬▬▬▬▬▬▬▬┤
│ 1 │ rot │
│ 2 │ grün │
│ 3 │ blau │
└▬▬▬▬┴▬▬▬▬▬▬▬▬▬▬▬┘
table.SIZES
┌▬▬▬▬┬▬▬▬▬▬▬┐
│ id │ size │
├▬▬▬▬┼▬▬▬▬▬▬┤
│ 1 │ 20 │
│ 2 │ 30 │
│ 3 │ 50 │
└▬▬▬▬┴▬▬▬▬▬▬┘
table.COLOR_SIZE_RELATION
colorid = FOREIGN_KEY COLORS.id
sizeid = FOREIGN_KEY SIZES.id
┌▬▬▬▬┬▬▬▬▬▬▬▬▬▬▬┬▬▬▬▬▬▬▬▬┬▬▬▬▬▬▬▬┐
│ id │ colorid │ sizeid │ price │
├▬▬▬▬┼▬▬▬▬▬▬▬▬▬▬┼▬▬▬▬▬▬▬▬┼▬▬▬▬▬▬▬┤
│ 1 │ 1 │ 1 │ 10 │
│ 2 │ 1 │ 2 │ 15 │
│ 3 │ 2 │ 1 │ 17 │
│ 4 │ 3 │ 1 │ 12 │
│ 5 │ 1 │ 3 │ 25 │
└▬▬▬▬┴▬▬▬▬▬▬▬▬▬▬┴▬▬▬▬▬▬▬▬┴▬▬▬▬▬▬▬┘
table.PRODUCTS
┌▬▬▬▬┬▬▬▬▬▬▬▬▬▬▬┬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬┐
│ id │ colorid │ ...andere Angaben... │
├▬▬▬▬┼▬▬▬▬▬▬▬▬▬▬┼▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬┤
│ 1 │ 1 │ ... │
│ 2 │ 1 │ ... │
│ 3 │ 1 │ ... │
│ 4 │ 2 │ ... │
│ 5 │ 2 │ ... │
└▬▬▬▬┴▬▬▬▬▬▬▬▬▬▬┴▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬┘
table.PRODUCT_DETAILS
productid = FOREIGN_KEY PRODUCTS.id
┌▬▬▬▬┬▬▬▬▬▬▬▬▬▬▬▬┬▬▬▬▬▬▬┬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬┐
│ id │ productid │ size │ ...andere Angaben... │
├▬▬▬▬┼▬▬▬▬▬▬▬▬▬▬▬┼▬▬▬▬▬▬┼▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬┤
│ 1 │ 1 │ 20 │ ... │
│ 2 │ 1 │ 30 │ ... │
│ 3 │ 2 │ 20 │ ... │
│ 4 │ 3 │ 50 │ ... │
│ 5 │ 4 │ 30 │ ... │
└▬▬▬▬┴▬▬▬▬▬▬▬▬▬▬▬┴▬▬▬▬▬▬┴▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬┘
Meine Abfrage soll über sämtliche Tabellen gehen und alle Informationen zu den Produkten in "PRODUCTS" liefern.
Über mehrere LEFT JOINS bekomme ich die Angaben aus "PRODUCT_DETAILS" und "COLORS".
Da ich aber in "PRODUCT_DETAILS" die Spalte "size" mit einem Wert aus "SIZES" habe und in "COLOR_SIZE_RELATION" die ID aus "SIZES", beiß ich mir die Zähne daran aus den entsprechenden Preis ("price") zu einer "color-size"-Kombination aus "COLOR_SIZE_RELATION" zu bekommen.
Als Abfragekriterium habe ich nur die "id" aus "PRODUCTS".
Ich hoffe ich konnte mein Problem verständlich beschreiben.
Bei Mißverständnissen versuch ich es nochmal besser :)
Die Frage ist also wie ich den richtigen "price" aus "COLOR_SIZE_RELATION" bekomme.
Danke!
Hi,
Zunächst meine Tabellenstrukturen
table.COLORS
┌▬▬▬▬┬▬▬▬▬▬▬▬▬▬▬▬┐
│ id │ colorname │
├▬▬▬▬┼▬▬▬▬▬▬▬▬▬▬▬┤
│ 1 │ rot │
│ 2 │ grün │
│ 3 │ blau │
└▬▬▬▬┴▬▬▬▬▬▬▬▬▬▬▬┘
Wie hast du das hier hingekriegt, die Tabellen so schön darzustellen?
Gruß, Kjorni
Wie hast du das hier hingekriegt, die Tabellen so schön darzustellen?
Wie hast du das hier hingekriegt, die Tabellen so schön darzustellen?
Ganz schön arrogante Antwort für einen Fragesteller!
Ganz schön arrogante Antwort für einen Fragesteller!
Das hast du falsch aufgefasst. So war das nicht gemeint.
In einem Fachforum, in dem du im Bereich PHP ein Frage gestellt hast, hätte ich erwartet, dass du ASCII-Zeichen erkennst - spätestens als du auf meinen Beitrag geantwortet und somit meine Eingaben als Zitat hattest.
Nichts für ungut :)
Nichts für ungut :)
Ok, kein Problem :-)
Hi!
Da ich aber in "PRODUCT_DETAILS" die Spalte "size" mit einem Wert aus "SIZES" habe und in "COLOR_SIZE_RELATION" die ID aus "SIZES", beiß ich mir die Zähne daran aus den entsprechenden Preis ("price") zu einer "color-size"-Kombination aus "COLOR_SIZE_RELATION" zu bekommen.
Wie sieht das Zähneausbeißen denn aus (sprich: dein derzeitiger Versuch)? Warum hast du denn da keinen Foreign Key sondern die Werte direkt verwendet? Wie auch immer, aus Product_Details bekommst du die Größe und du brauchst deren ID für die Color_Size_Relation. Verbinde die Größenangebe aus den Details mit der aus Sizes und die Sizes.id mit Color_Size_Relation.sizeid. Dazu musst du nicht unbedingt Joins nehmen, es gehen auch korrelierte Unterabfragen.
Lo!
Warum hast du denn da keinen Foreign Key sondern die Werte direkt verwendet?
Die Werte bekomme ich geliefert. Die Id von "SIZES" wär mir auch lieber.
Wie auch immer, aus Product_Details bekommst du die Größe und du brauchst deren ID für die Color_Size_Relation. Verbinde die Größenangebe aus den Details mit der aus Sizes und die Sizes.id mit Color_Size_Relation.sizeid. Dazu musst du nicht unbedingt Joins nehmen, es gehen auch korrelierte Unterabfragen.
Leider bin ich nicht so fit mit den MySQL-Abfragen. Ich bin froh, dass ich es mit den Joins hinbekommen habe. Zumindest scheint meine Abfrage so wie ich sie jetzt habe genau das zu tun was ich möchte.
Wenn es komfortabler geht, bin ich für Hinweise gern offen. Aber nicht vergessen, ich bin nicht so fit ;)
Mein Versuch sieht jetzt so aus.
Ist das korrekt?
SELECT
PRODUCTS.id,
PRODUCTS...andere Angaben...,
COLORS.colorname,
COLOR_SIZE_RELATION.price,
PRODUCT_DETAILS.size,
PRODUCT_DETAILS...andere Angaben...,
FROM
PRODUCTS
LEFT JOIN
PRODUCT_DETAILS
ON PRODUCT_DETAILS.productid = PRODUCTS.id
LEFT JOIN
COLORS
ON COLORS.id = PRODUCTS.colorid
LEFT JOIN
(COLOR_SIZE_RELATION
INNER JOIN
SIZES
ON SIZES.id = COLOR_SIZE_RELATION.sizeid
)
ON COLOR_SIZE_RELATION.colorid = PRODUCTS.colorid
AND SIZES.size = PRODUCT_DETAILS.size
WHERE
PRODUCTS.id = '1'