Ferris: MySQL - verzwickte Abfrage über mehrere Tabellen

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!

  1. 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

    1. Wie hast du das hier hingekriegt, die Tabellen so schön darzustellen?

      ASCII-Tabelle

      1. Wie hast du das hier hingekriegt, die Tabellen so schön darzustellen?

        ASCII-Tabelle

        Ganz schön arrogante Antwort für einen Fragesteller!

        1. 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 :)

          1. Nichts für ungut :)

            Ok, kein Problem :-)

  2. 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!

    1. 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 ;)

  3. 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'