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