GRoupBy Schwierigkeit bei Preislisten

GRoupBy Schwierigkeit bei Preislisten

am 04.12.2007 17:28:24 von MD Websunlimited

Hi *,

ich hätt eine Schwierigkeit:
SELECT
Name, Bestellnummer,
Preis,
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(GültigVon) AS PreisAlter
FROM produkte LEFT
JOIN preise ON preise.Produkt_ID = produkte.ID
WHERE produkte.Sichtbar='Y'
GROUP BY Name
ORDER BY PreisAlter ASC

Tabelle produkte
-----------------
ID Name Bestellnummer
1 "test" "0001"

Tabelle Preise
-----------------
ID produkt_ID GültigVon Preis
1 1 1.1.00 200.00
1 1 03.12.07 201.00

Obige Abfrage gibt immer nur den ersten Preis zurück.
Wie kann ich denn pro Produkt mit mehrern Preiseinträgen
immer nur den aktuellsten bekommen?

Eine weitere Spalte "DieserPreisIstGültig" wollte ich mir sparen.

Danke,
Christoph

Re: GRoupBy Schwierigkeit bei Preislisten

am 04.12.2007 20:01:36 von Andreas Kretschmer

Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect. (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly." (unknown)
Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°

Re: GRoupBy Schwierigkeit bei Preislisten

am 05.12.2007 12:10:40 von MD Websunlimited

*doh*, subselect, natürlich ;)
DBMS ist mysql 5.1, das kann subselects.
ICh schau mal, dass ich das portieren kann,
wenns nicht klappt, rühr ich mich nochmal.

Danke Dir,
Christoph

Ok, kleines Problem mit MySQL...

am 05.12.2007 12:31:32 von MD Websunlimited

Hi,

habe jetzt die Abfrage portiert:

SELECT
a.Name,
a.Bestellnummer,
a.Gewicht,
b.Preis,
b.GueltigVon
FROM produkte a LEFT
JOIN (
SELECT
DISTINCT(Produkt_pKey) AS Produkt_pKey,
Preis,
GueltigVon
FROM preise
ORDER BY Produkt_pKey, GueltigVon DESC
) b ON (a.pKey=b.Produkt_pKey)

Leider kann mysql kein DISTINCT auf einzelne
Spalten, das scheint nur mit Aggregation zu
funktionieren. Zumindest ergibt die Abfrage oben:

Prod1 00020 0.950 502.0000 2007-12-05 12:24:38
Prod1 00020 0.950 499.0000 0001-01-01 00:00:00
Prod2 00021 0.200 99.0000 0001-01-01 00:00:00
Prod3 00041 0.100 7.5000 0001-01-01 00:00:00
Prod4 99999 0.000 6.9000 0001-01-01 00:00:00


Kann ich das mit UNIX_TIMESTAMP() lösen?

also Pseudo-Code:
SELECT
[...],
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(GueltigVon) AS PreisAlter
WHERE
"""PreisAlter is %%minimal%%"""

Danke,
Christoph

Re: Ok, kleines Problem mit MySQL...

am 05.12.2007 12:39:18 von Claus Reibenstein

Christoph Söllner schrieb:

> DISTINCT(Produkt_pKey) AS Produkt_pKey,

DISTINCT Produkt_pKey,

tut's auch.

> Leider kann mysql kein DISTINCT auf einzelne
> Spalten, das scheint nur mit Aggregation zu
> funktionieren. Zumindest ergibt die Abfrage oben:

Fehlermeldung? Oder einfach nur falsche Ergebnisse?

Gruß. Claus

Re: Ok, kleines Problem mit MySQL...

am 05.12.2007 12:43:55 von MD Websunlimited

Hi,

>> DISTINCT(Produkt_pKey) AS Produkt_pKey,
> DISTINCT Produkt_pKey,
> tut's auch.

>> Leider kann mysql kein DISTINCT auf einzelne
>> Spalten, das scheint nur mit Aggregation zu
>> funktionieren. Zumindest ergibt die Abfrage oben:
> Fehlermeldung? Oder einfach nur falsche Ergebnisse?

Nein, keine Fehlermeldung, aber das DISTINCT gilt
dann nur für die ganze Zeile, und die unterscheiden
sich ja im Preis. Deswegen fliegt die Zeile mit dem
alten Preis nicht raus, und ich bekomme ein Produkt
zweimal mit jeweils unterschiedlichen Preisen.

Wegen nur mit Aggregation:
SELECT
COUNT (DISTINCT(Name)) AS Anzahl
FROM ...

funktioniert natürlich einwandfrei.

Danke trotzdem,
Christoph

Re: Ok, kleines Problem mit MySQL...

am 05.12.2007 12:49:09 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: Ok, kleines Problem mit MySQL...

am 05.12.2007 13:33:07 von MD Websunlimited

> Das von mir verwendete DISTINCT ON ist eine
> Erweiterung von PostgreSQL.
Ja, das hab ich mir schon fast gedacht, weil
bei MySQL nichts dazu zu finden war. Aber hab's
mittlerweile über ein Subselect gelöst:

SELECT
Name,
Beschreibung,
Bestellnummer,
VPE,
Gewicht,
Preis AS PreisNetto
FROM wsprodukte a LEFT
JOIN (
SELECT *
FROM wspreise
WHERE [...]
ORDER BY Einrichtung_pKey DESC, GültigVon DESC
) AS b ON (a.pKey=b.Produkt_pKey)
WHERE [...]
GROUP BY Produkt_pKey
ORDER BY Bestellnummer ASC

Danke Dir für Deine Mühe...
Christoph