Abfrage über 3 Tabellen und Summe eines Feldes ausgeben

Abfrage über 3 Tabellen und Summe eines Feldes ausgeben

am 12.06.2006 19:25:29 von daniel

Hallo,

vielleicht könnt ihr mir den Abend retten.

Ich habe in der DB folgende Tabellen zur Verfügung:

Benutzer
- Benutzer-ID
- Benutzername

Bestellungen
- Bestellungs-ID
- Benutzer-ID

Artikel aus Bestellungen
- Bestellungs-ID
- Artikelname
- Artikelpreis

Folgende Daten möchte ich auslesen:
- Benutzername
- Anzahl der Bestellungen pro Benutzer
- Gesamtpreis aller Bestellungen des Benutzers

Damit bin ich bisher auf folgenden Query gekommen:

SELECT bestellungen1.benutzerID, benutzer1.name,
count(bestellungen1.ID) AS anzahl, (
SELECT SUM(artikel2.preis) FROM artikel AS artikel2 JOIN
bestellungen AS bestellungen2 ON bestellungen2.ID =3D
artikel2.bestellungsID WHERE bestellungen2.ID =3D bestellungen1.ID GROUP
BY bestellungen2.ID) as gesamtpreis
FROM benutzer AS benutzer1
JOIN bestellungen AS bestellungen1 ON bestellungen1.benutzerID =3D
benutzer1.ID
GROUP BY benutzer1.ID
ORDER BY anzahl DESC;

Das funktioniert soweit auch alles, bis darauf, daß ich immer nur den
Gesamtpreis der ersten Bestellung des Kunden, aber nicht den
Gesamtpreis ALLER Bestellungen des Kunden erhalte. Wo habe ich da den
Denkfehler?

Grüße, Daniel

Re: Abfrage über 3 Tabellen und Summe eines Feldes ausgeben

am 12.06.2006 21:23:34 von Dominik Echterbruch

Daniel wrote:
^^^^^^
Wer?

> Ich habe in der DB folgende Tabellen zur Verfügung:

Und ich hab's mal etwas übersichtlicher gestaltet.

> Benutzer (BenutzerID, Benutzername)
> Bestellungen (BestellungsID, BenutzerID)
> bestellte_artikel (BestellungsID, Artikelname, Artikelpreis)
>
> Folgende Daten möchte ich auslesen:
> - Benutzername
> - Anzahl der Bestellungen pro Benutzer
> - Gesamtpreis aller Bestellungen des Benutzers

[seltsame Abfrage]

> Das funktioniert soweit auch alles, bis darauf, daß ich immer nur den
> Gesamtpreis der ersten Bestellung des Kunden, aber nicht den
> Gesamtpreis ALLER Bestellungen des Kunden erhalte. Wo habe ich da den
> Denkfehler?

Deine Abfrage ist ganz einfach zu kompliziert. Ich weiß nicht, was das
Subselect da drin soll und ich habe es mir auch nicht genau angeschaut,
aber folgendes sollte dein Problem lösen:

SELECT ben.benutzername, COUNT(bes.*), SUM(ba.artikelpreis)
FROM benutzer ben
INNER JOIN bestellungen bes ON bes.benutzerid = ben.benutzerid
INNER JOIN bestellte_artikel ba ON ba.bestellungsid = bes.bestellungsid
GROUP BY ben.benutzername


Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Abfrage über 3 Tabellen und Summe eines Feldes ausgeben

am 13.06.2006 02:18:01 von Daniel Seifert

Hallo,

> > Daniel wrote:
> Wer?
Ok, schon geändert. ;-)

> > Benutzer (BenutzerID, Benutzername)
> > Bestellungen (BestellungsID, BenutzerID)
> > bestellte_artikel (BestellungsID, Artikelname, Artikelpreis)
> >
> > Folgende Daten möchte ich auslesen:
> > - Benutzername
> > - Anzahl der Bestellungen pro Benutzer
> > - Gesamtpreis aller Bestellungen des Benutzers

> SELECT ben.benutzername, COUNT(bes.*), SUM(ba.artikelpreis)
> FROM benutzer ben
> INNER JOIN bestellungen bes ON bes.benutzerid = ben.benutzerid
> INNER JOIN bestellte_artikel ba ON ba.bestellungsid = bes.bestellungsid
> GROUP BY ben.benutzername

Klappt ja soweit, doch ein Problem tut sich da jetzt neu auf.
Binde ich mit JOIN die 3. Tabelle (bestellte_artikel) ein, zählt mir der
COUNT(bes.ID) nicht mehr die Bestellungen, sondern die bestellten Artikel
pro Benutzer. Das habe ich nur lösen können, wenn ich die 3. Tabelle außen
vor lasse. Doch dann gibt's logischerweise keine Gesamtbestellsumme. Gibt es
eine Möglichkeit, beide Werte über einen Query zu erhalten?

Weiß vielleicht jemand Rat?

Grüße, Daniel

Re: Abfrage über3 Tabellen und Summe eines Feldes ausgeben

am 13.06.2006 11:26:17 von Harald Fuchs

In article ,
"Daniel Seifert" writes:

>> SELECT ben.benutzername, COUNT(bes.*), SUM(ba.artikelpreis)
>> FROM benutzer ben
>> INNER JOIN bestellungen bes ON bes.benutzerid =3D ben.benutzerid
>> INNER JOIN bestellte_artikel ba ON ba.bestellungsid =3D bes.bestellungsi=
d
>> GROUP BY ben.benutzername

> Klappt ja soweit, doch ein Problem tut sich da jetzt neu auf.
> Binde ich mit JOIN die 3. Tabelle (bestellte_artikel) ein, zählt mir de=
r
> COUNT(bes.ID) nicht mehr die Bestellungen, sondern die bestellten Artikel
> pro Benutzer.

count(DISTINCT bes.ID)

Re: Abfrage über= 3 Tabellen und Summe eines Feldes ausgeben

am 13.06.2006 12:44:46 von Daniel Seifert

Hallo Harald,

> count(DISTINCT bes.ID)

Vielen Dank, hatte DISTINCT schon in der Mache, doch meine Docu hat's mir
falsch beschrieben. Da hab ich's wieder ungetestet verworfen. Werde mal die
Docu wechseln müssen. Jetzt klappt alles wie gewollt.

Grüße, Daniel