Abfrage über drei Tabellen (mit Zwischentabelle)
Abfrage über drei Tabellen (mit Zwischentabelle)
am 19.02.2007 10:26:36 von g.thaler
Ich mache soeben meine ersten Schritte in der Datenbankprogrammierung
und habe drei einfache Tabellen,
je eine für die Kunden, eine für die Artikel, die von den Kunden gekauft
werden, und eine Zwischentabelle,
welche die Bestelldetails beinhaltet.
Wie gestalte ich eine Abfrage, die mir Folgendes ausgibt:
alle Bestellungen aller Kunden
gesamtpreis pro Bestellung (errechnet durch artikel.stueckpreis *
bestelldetails * stk)
kunden
------
kid name plz
----------------------------------------------
1 Herbert Müller A-8020
2 Isabella Huber A-1110
3 Norbert Gaishuber A-3500
4 Beate Gstrein D-8500
bestelldetails
--------------
beid kid aid stk bestdatum zahlungseingang
------------------------------------------------------------ ------------
1 1 1 3 2007-02-12 2007-02-15
2 3 3 2 2007-02-01 2007-02-01
3 1 2 1 2007-02-03 2007-02-07
4 2 4 3 2007-01-25 2007-02-01
5 4 3 3 2007-01-27 2007-02-03
6 4 3 1 2007-01-15 2007-02-20
7 1 2 2 2007-02-02 0000-00-00
8 2 6 19 2007-02-15 2007-02-19
9 2 3 3 2007-02-08 2007-02-15
10 2 5 2 2007-01-18 2007-02-25
artikel
--------
aid bezeichnung stueckpreis
------------------------------------------------------------ -------
1 Bosch Schlagbohrer 3478 199.00
2 Black&Decker-Bohrhammer 15 250.00
3 Schraubenzieher-Set 50.00
4 Wasserwaage 9.00
5 Teekessel 20.00
6 Benzinkanister 30.00
Bitte um Hilfe. Habe ich die drei Tabellen für diesen Zweck überhaupt
richtig angelegt? Besten Dank im Voraus.
lg Günter
Re: Abfrage überdrei Tabellen (mit Zwischentabelle)
am 19.02.2007 11:14:00 von Daniel Fischer
Günter Thaler!
> Wie gestalte ich eine Abfrage, die mir Folgendes ausgibt:
>
> alle Bestellungen aller Kunden
> gesamtpreis pro Bestellung (errechnet durch artikel.stueckpreis *
> bestelldetails * stk)
ungefähr so:
SELECT bestelldetails.kid, kunden.name, bestelldetails.beid,
SUM(bestelldetails.stk*artikel.stueckpreis) AS gesamtpreis
FROM bestelldetails
LEFT JOIN artikel ON bestelldetails.aid=artikel.aid
LEFT JOIN kunden ON bestelldetails.kid=kunden.kid
GROUP BY bestelldetails.beid
ORDER BY bestelldetails.kid
> Bitte um Hilfe. Habe ich die drei Tabellen für diesen Zweck überhaupt
> richtig angelegt? Besten Dank im Voraus.
In deinen Daten bestellen die Kunden pro Bestellung immer nur einen
Artikel. Wenn das geplant ist, geht's so. Ansonsten könntest du noch
etwas weiter normalisieren. Also z.B. in bestelldetails nur
beid,kid,bestdatum,zahlungseingang und in einer weiteren Tabelle
beid,aid,stk. Ob Land+PLZ tatsächlich eine einzige Spalte sein sollte,
ist bei so einem Beispiel dagegen mehr oder weniger Geschmacksache.
Gruß
Daniel
Re: Abfrage über drei Tabellen (mit Zwischentabelle)
am 19.02.2007 11:57:51 von g.thaler
Besten Dank für deine Antwort! Das Interessante: mir war gar nicht klar,
dass ein Kunde pro Bestellung nur einen Artikel bestellen kann. ich will
schon haben, dass ein Kunde bei ein und derselben Bestellung mehrere
verschiedene Artikel bestellen kann.
Wenn ich dich richtig verstehe, muss ich zwischen den Bestellungen und
den Artikeln eine m:n-Beziehung herstellen, indem ich zwischen
Bestellungen und Artikel so etwas wie Bestellposten als Zwischentabelle
einführe:
kunden
------
kid (primary)
name
plz
bestellungen
------------
beid (primary)
kid (foreign)
bestdatum
bestellposten
-------------
bpid (primary)
beid (foreign)
aid (foreign)
stk
artikel
-------
aid (primary)
bezeichnung
stueckpreis
ich habe nun also
kunden : bestellungen = 1:n
bestellungen : bestellposten = 1:n
artikel : bestellposten = 1:n
Wäre nun mein gefordertes Konzept richtig umgesetzt?
Wie würde nun der Select aussehen? Ich habe bereits einen Knopf im Kopf.
>Ob Land+PLZ tatsächlich eine einzige Spalte sein sollte,
>ist bei so einem Beispiel dagegen mehr oder weniger Geschmacksache.
Ja, es handelt sich um eine Beispieldatenbank zu Lernzwecken, die
grundsätzliche Anforderungen darstellen soll.
Wenn ich mich drei Jahre nicht mit SQL beschäftige, schaue ich dann da nach.
lg Günter
Re: Abfrage über drei Tabellen (mit Zwischentabelle)
am 19.02.2007 12:14:59 von Claus Reibenstein
Günter Thaler schrieb:
> Wenn ich dich richtig verstehe, muss ich zwischen den Bestellungen und
> den Artikeln eine m:n-Beziehung herstellen, indem ich zwischen
> Bestellungen und Artikel so etwas wie Bestellposten als Zwischentabelle
> einführe:
So ist es.
GruÃ. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /