Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Abfrage mit JOIN über 4 Tabellen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von newbie, 29 Mai 2016.

  1. newbie

    newbie Benutzer

    Entschuldigt, mit Sicherheit ist eine ähnliche Abfrage schon mehrfach hier besprochen worden.
    Allerdings habe ich nichts passendes gefunden.

    Angenommen ich habe 4 Tabellen:

    Autos (Alle Autos, die ein Autohaus verkauft)
    Angebot (bestimmtes Angebot für ein Auto) -> beinhaltet den PK von Autos als FK
    Auswahl (Beziehungstabelle zw. Kunde und Angebot) -> beinhaltet die PKs von Autos und Kunden
    Kunden (Alle Kunden des Autohauses)

    D.h.
    - ein Auto kann mehrfach angeboten werden, aber ein Angebot enthält immer nur ein Auto
    - ein Kunde kann mehrere Angebote bekommen und ein Angebot kann an mehrere Kunden gehen.
    (Ist daher natürlich kein richtiges Angebot mit fest zugeordneter Angebotsnummer)

    Wie bekomme ich nun eine Liste, die besagt, welcher Kunde zu welchem Auto ein Angebot bekommen hat?

    Vielen Dank schon mal vorab!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    was ist denn dein Ansatz?

    Meiner wäre ein Select auf Auswahl mit Joins auf die nötigen Tabellen ...
     
  3. newbie

    newbie Benutzer

    Hallo akretschmer,
    danke für die schnelle Rückmeldung.

    wie immer, wenn ich mich mit so etwas befassen muss, laufe ich erstmal in den Fehler es ohne JOINS zu versuchen

    Das wirft mir natürlich nur ein reduziertes kathesisches Prokukt aus.

    Wenn ich also davon ausgehe, dass ich evtl. nach einem bestimmten Kunden filtern möchte, und meine Kunden-Tabelle die linke ist, würde ich einen RIGHT JOIN bauen. Allerdings scheitere ich völligst an der Verschachtelung.
    Oder ist mein Ansatz schon grundlegend falsch?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ohne deinen Ansatz zu sehen ist es schwer, diesen zu beurteilen.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    vermutlich hast /willst Du in etwas sowas:

    Code:
    test=*# \d autos;
      Table "public.autos"
     Column |  Type  | Modifiers
    --------+---------+-----------
     id  | integer | not null
     name  | text  |
    Indexes:
      "autos_pkey" PRIMARY KEY, btree (id)
    Referenced by:
      TABLE "angebot" CONSTRAINT "angebot_auto_fkey" FOREIGN KEY (auto) REFERENCES autos(id)
    
    test=*# \d angebot
      Table "public.angebot"
     Column |  Type  | Modifiers
    --------+---------+-----------
     id  | integer | not null
     auto  | integer |
     preis  | integer |
    Indexes:
      "angebot_pkey" PRIMARY KEY, btree (id)
    Foreign-key constraints:
      "angebot_auto_fkey" FOREIGN KEY (auto) REFERENCES autos(id)
    Referenced by:
      TABLE "auswahl" CONSTRAINT "auswahl_angebot_fkey" FOREIGN KEY (angebot) REFERENCES angebot(id)
    
    test=*# \d auswahl
      Table "public.auswahl"
     Column  |  Type  | Modifiers
    ---------+---------+-----------
     kunde  | integer |
     angebot | integer |
     datum  | date  |
    Foreign-key constraints:
      "auswahl_angebot_fkey" FOREIGN KEY (angebot) REFERENCES angebot(id)
      "auswahl_kunde_fkey" FOREIGN KEY (kunde) REFERENCES kunden(id)
    
    test=*# \d kunden
      Table "public.kunden"
     Column |  Type  | Modifiers
    --------+---------+-----------
     id  | integer | not null
     name  | text  |
    Indexes:
      "kunden_pkey" PRIMARY KEY, btree (id)
    Referenced by:
      TABLE "auswahl" CONSTRAINT "auswahl_kunde_fkey" FOREIGN KEY (kunde) REFERENCES kunden(id)
    
    test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id;
     kunde | auto
    -------+------
    (0 rows)
    
    test=*#
    
    Mahlzeit.
     
  6. newbie

    newbie Benutzer

    Danke!
    hier nochmal mein Ansatz:
    Sah genauso aus, nur dass ich in der selben Reihenfolge RIGHT JOINS nutzen wollte, und in der FROM-Anweisung die Tabelle "auto a" hatte, weil er ohne sagte, dass er a.name nicht kennt. aber mit diesem Eintrag kannte er k.id nicht. Lag wahrscheinlich an der falschen JOIN "Richtung"
     
  7. akretschmer

    akretschmer Datenbank-Guru

    ach, das sagen dann alle hinterher ;-)
     
  8. newbie

    newbie Benutzer

    Naja ;-)
    ... okay, stimmt schon.
    Aber ich habe ja beschrieben, was mein Fehler war.
    Ich war wirklich fester Überzeugung, ich müsste mich rechts herum orientieren. Und dann kann er offensichtlich die Tabellen nicht zuordnen.
     
    akretschmer gefällt das.
  9. newbie

    newbie Benutzer

    Jetzt habe ich aber doch noch eine Frage...

    Ich möchte gerne nur die Angebote für einen bestimmten Kunden Anzeigen.
    Hier mein Ansatz ;-) :
    SELECT K.Name, A.Auto FROM Auswahl AU LEFT JOIN Kunden K ON AU.Kunde=K.ID AND K.Name="Meier"...

    Dann bekomme ich das selbe Ergebnis, nur dass alle anderen Kunden "NULL" im Feld Name stehen haben...

    Muss ich hier dann nicht doch einen RIGHT JOIN benutzen?
     
  10. akretschmer

    akretschmer Datenbank-Guru

    finde den Unterschied!

    Code:
    test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id;
      kunde  |  auto  
    ---------+--------
     kunde 1 | auto 1
     kunde 2 | auto 2
    (2 rows)
    
    test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id and k.name = 'kunde 1' left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id;
      kunde  |  auto  
    ---------+--------
     kunde 1 | auto 1
      | auto 2
    (2 rows)
    
    test=*# select k.name as kunde, a.name as auto  from auswahl au left join kunden k on au.kunde=k.id left join angebot an on au.angebot=an.id left join autos a on an.auto=a.id where k.name = 'kunde 1';
      kunde  |  auto  
    ---------+--------
     kunde 1 | auto 1
    (1 row)
    
    
    Bitte nicht Join und Where-Conditions mixen.
     
  11. newbie

    newbie Benutzer

    Du meinst JOIN -> WHERE -> JOIN ?
    Denn die Untere, also JOIN -> JOIN -> WHERE funktioniert ja ganz gut
     
  12. akretschmer

    akretschmer Datenbank-Guru

  13. newbie

    newbie Benutzer

    Vielen Dank nochmal!
    Jetzt hab ich alles was ich brauche.
    Super Forum!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden