Abfrage mit Kauf und letztem Kauf
Abfrage mit Kauf und letztem Kauf
am 26.02.2007 21:45:28 von Peter Klausner
Hallo Leute,
ich habe folgende (vereinfachte) Tabelle für Käufe von Kunden:
id | customer | (aus separater Tab.) | date_purchase | amount_purchase
============================================================ ===========
1 Peter 2006-10-31 500
2 Paul 2005-01-13 50
3 Peter 2004-07-01 1045
4 Paul 2007-02-11 74
Jetzt möchte ich ein Abfrage erstellen, die alle Käufe auflistet und
dazu in einer zusätzlichen Spalte den Kaufbetrag des vorherigen Kaufs
dieses Kunden. Für das obige Beispiel sollte das Resultat also so
aussehen:
id | customer | date_purchase | amount_purchase | amount_last_purchase
============================================================ ===========
1 Peter 2006-10-31 500 NULL
2 Paul 2005-01-13 50 NULL
3 Peter 2004-07-01 1045 500
4 Paul 2007-02-11 74 1045
Leider beiße ich mir als MySQL-Neuling daran derzeit die Zähne aus. Ich
vermute, dass es irgendwie über Subqueries gelöst werden kann, aber wie?
Kann jemand helfen?
Besten Dank
Peter
Re: Abfrage mit Kauf und letztem Kauf
am 27.02.2007 08:21:16 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: Abfrage mit Kauf und letztem Kauf
am 27.02.2007 09:23:12 von Daniel Fischer
Peter Klausner!
> Jetzt möchte ich ein Abfrage erstellen, die alle Käufe auflistet und
> dazu in einer zusätzlichen Spalte den Kaufbetrag des vorherigen Kaufs
> dieses Kunden. Für das obige Beispiel sollte das Resultat also so
> aussehen:
Die Beschreibung ist irgendwie nicht konsistent mit deinem Wunschergebnis:
> id | customer | date_purchase | amount_purchase | amount_last_purchase
> ============================================================ ===========
> 1 Peter 2006-10-31 500 NULL
Der diesem Kauf vorhergehende ist id 3, also amount_last_purchase 1045.
> 2 Paul 2005-01-13 50 NULL
> 3 Peter 2004-07-01 1045 500
Das ist der erste Kauf von Peter, also amount_last_purchase NULL.
> 4 Paul 2007-02-11 74 1045
Die 1045 hat nicht Paul ausgegeben, sondern Peter; hier muesste 50 stehen
fuer den vorhergenden Eintrag mit id 2.
> Leider beiße ich mir als MySQL-Neuling daran derzeit die Zähne aus. Ich
> vermute, dass es irgendwie über Subqueries gelöst werden kann, aber wie?
Wenn das, was ich oben geschriebenn habe, stimmt, geht es ungefähr so:
SELECT a.*,
(SELECT amount_purchase FROM kauf b
WHERE a.customer = b.customer AND b.date_purchase < a.date_purchase
ORDER BY id DESC LIMIT 1) AS amount_last_purchase
FROM kauf a;
Gruß
Daniel
Re: Abfrage mit Kauf und letztem Kauf
am 27.02.2007 21:00:46 von Peter Klausner
Am Tue, 27 Feb 2007 09:23:12 +0100 schrieb Daniel Fischer:
> Die Beschreibung ist irgendwie nicht konsistent mit deinem Wunschergebnis:
Hmpf, ja, du hast Recht! Wenigstens die Beispiele sollte ich eigentlich
hinbekommen, Asche auf mein Haupt!
> Wenn das, was ich oben geschriebenn habe, stimmt, geht es ungefähr so:
>
> SELECT a.*,
> (SELECT amount_purchase FROM kauf b
> WHERE a.customer = b.customer AND b.date_purchase < a.date_purchase
> ORDER BY id DESC LIMIT 1) AS amount_last_purchase
> FROM kauf a;
Glücklicherweise hast du meine Beschreibung trotz des fehlerhaften
Beispiels richtig interpretiert. Dein Vorschlag klingt für mich intuitiv
logisch. Leider stürzt der MySQL Query Browser aber kommentarlos ab, wenn
ich versuche, diese Abfrage auszuführen.
Woran könnte das liegen?
Ich weiß nicht, ob das weiterhilft, aber ich verwende MySQL 5.0.24 unter
Linux. Der Query Browser ist Version 1.1.18.
Herzliche Grüße und besten Dank
Peter
Re: Abfrage mit Kauf und letztem Kauf
am 28.02.2007 07:32:48 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: Abfrage mit Kauf und letztem Kauf
am 28.02.2007 09:58:43 von Daniel Fischer
Andreas Kretschmer!
> Nett und funktioniert¹. Wollt ich nur mal gesagt haben. Allerdings hab
> ich Zweifel, ob das bei großen Tabellen noch performt. Da sollte man für
> customer numerische IDs und Indexe verwenden.
Das wird er ja dann unweigerlich merken, aber es hieß ja, dass es sich um
vereinfachte Tabellen handelt. Zumindest den Index bekommt man ja ohne
Aenderung am SQL dazu.
Gruß
Daniel
Re: Abfrage mit Kauf und letztem Kauf
am 28.02.2007 21:43:40 von Peter Klausner
Am Tue, 27 Feb 2007 21:00:46 +0100 schrieb Peter Klausner:
> Glücklicherweise hast du meine Beschreibung trotz des fehlerhaften
> Beispiels richtig interpretiert. Dein Vorschlag klingt für mich intuitiv
> logisch. Leider stürzt der MySQL Query Browser aber kommentarlos ab, wenn
> ich versuche, diese Abfrage auszuführen.
>
> Woran könnte das liegen?
OK, ich hab den Fehler gefunden: es lag an einem falsch geschriebenen
Spaltennamen. Trotzdem seltsam, dass der MySQL Query Browser deswegen
abstürzt, oder?
Jedenfalls funktioniert's jetzt einwandfrei!
Beste Grüße und nochmal Dank an alle
Peter
Re: Abfrage mit Kauf und letztem Kauf
am 28.02.2007 21:44:57 von Peter Klausner
Am Wed, 28 Feb 2007 07:32:48 +0100 schrieb Andreas Kretschmer:
> begin Daniel Fischer schrieb:
>> Wenn das, was ich oben geschriebenn habe, stimmt, geht es ungefähr so:
>>
>> SELECT a.*,
>> (SELECT amount_purchase FROM kauf b
>> WHERE a.customer = b.customer AND b.date_purchase < a.date_purchase
>> ORDER BY id DESC LIMIT 1) AS amount_last_purchase
>> FROM kauf a;
>
> Nett und funktioniert¹. Wollt ich nur mal gesagt haben. Allerdings hab
> ich Zweifel, ob das bei großen Tabellen noch performt. Da sollte man für
> customer numerische IDs und Indexe verwenden.
Ja, richtig. Das war nur zur Vereinfachung. Die "customers" werden über
in der Tat über eine numerische ID (primary key der Tabelle customers)
eingebunden.
Grüße
Peter
Re: Abfrage mit Kauf und letztem Kauf
am 01.03.2007 11:29:31 von Daniel Fischer
Peter Klausner!
> OK, ich hab den Fehler gefunden: es lag an einem falsch geschriebenen
> Spaltennamen. Trotzdem seltsam, dass der MySQL Query Browser deswegen
> abstürzt, oder?
Jeder Crash ist seltsam, Software sollte nie abstürzen. Hast du einen Bug
gemeldet (http://bugs.mysql.com/)?
Gruß
Daniel