view auf preis nach letztem datum anzeigen

SirHarry

Neuer Benutzer
Beiträge
3
Hallo Profis
Ich hätte da mal eine Frage ;)
Ich habe ein Einkaufsprogramm für meine Frau erstellt, in welchem u.a eine Preishistorie erstellt wird.
Daher gibt es zu jedem Geschäft und Produkt mehrere Preise mit Eingabedatum.

Ich habe eine View erstellt, welche folgende Tabellen verknüpft.
Produkte,Preise,Geschäfte. Alle Tabellen sind über IDs verknüpft.
Ich denke, der Zusammenhang zwischen den Tabellen ist selbsterklärend.

Hier mal die View:

select `preise`.`Produkt_id` AS `Produkt_id`,
`preise`.`Geschäft_id` AS `Geschäft_id`,
`preise`.`Preis` AS `preis`,
`preise`.`datum` AS `Datum`,
`produkte`.`produkt` AS `Produkt`,
`produkte`.`bemerkung` AS `Bemerkung`,
`geschaefte`.`Name` AS `Name`,
`geschaefte`.`Ort` AS `Ort`,
`preise`.`beurteilung` AS `beurteilung`
from ((`preise` join `produkte`) join `geschaefte`)
where
((`preise`.`Geschäft_id` = `geschaefte`.`Geschäft_id`) and
(`preise`.`Produkt_id` = `produkte`.`produkt_id`))
group by `preise`.`Produkt_id`,
`preise`.`Geschäft_id`,
`preise`.`preis`
order by max(`preise`.`datum`)

(Sorry! Ich habe keine Funktion gefunden, hier Code lesbar einzufügen.)

Die View soll mir für jedes Geschäft und Produkt den zuletzt eingegebenen Preis anzeigen.
Macht sie aber natürlich nicht!
Ich habe schon alle, mir bekannten Möglichkeiten ausprobiert. Nichts klappt!
Könnt ihr vielleicht helfen?
 
Werbung:
Das ist in mehrerer Hinsicht kapott, da weiß man gar nicht, wo man zuerst anfangen soll...

  • zu den JOIN's fehlt die JOIN-Condition
  • diese verbaust Du in der Where-Condition
  • mehr Spalten im Select als später aggregiert/gruppiert werden

Manche dieser Fehler kann MySQL aus Blödheit selber nicht entdecken und liefert Dir ein falsches Resultat, andere Fehler sollte es entdecken, insbesondere die falsche Join-Syntax.

Wenn Du für jede Geschäft und Produkt den letzten Preis (nach Datum, nicht in der Höhe) wissen willst, dann sag das auch. Sinngemäß:

select geschäft, produkt, max(datum) from ... group by geschäft, produkt;

Wenn Du jetzt noch den Preis dazu wissen willst, nimmst Du das Ergebniss und joinst über (produkt, max(datum)) die nötige Tabelle dazu. Alternativ kannst Du mit Window-Funktionen arbeiten und über row_number() oder besser noch rank() oder dense_rank() arbeiten, aber erstens kann möglicherweise Dein MySQL das gar nicht und zweitens wollen wir erst mal einfach anfangen, oder?

select kaffee!
 
Vielen Dank zunächst für die schnelle Antwort und die Hinweise.

select geschäft, produkt, max(datum) from ... group by geschäft, produkt;

Das habe ich auch schon probiert.
Aber dann liefert mir die View, im Fall, dass ich z.B. 3 Datensätze für ein Produkt/Geschäft habe, mit unterschiedlichen Datum und Preisen, wie erwartet das letzte Datum aber nicht den dazu passenden Preis, sondern den ersten Preis aus den 3 Datensätzen.
Jetzt könnte ich mir für den passenden Preis mit einer Unterabfrage helfen, aber das macht die Sache auch sehr langsam.

Hmm..
Ich geb es ehrliich zu , von Joins habe ich nicht viel Ahnung (wie man sieht ;))

Ich helfe mir immer folgendermassen:
select tab1.xx,tab2.yy,tab3.zz from tab1,tab2,tab3 und dann verknüpfe ich die Tabellen in den where-Bedingungen.
Klappt im allgemeinen ganz gut.

Die obige SQL habe ich bekommen, nachdem ich mein Select in HeidiSQL als View eingefügt habe.
Heidi hat das dann mittels Joins 'optimiert'
 
Vielen Dank zunächst für die schnelle Antwort und die Hinweise.



Das habe ich auch schon probiert.
Aber dann liefert mir die View, im Fall, dass ich z.B. 3 Datensätze für ein Produkt/Geschäft habe, mit unterschiedlichen Datum und Preisen, wie erwartet das letzte Datum aber nicht den dazu passenden Preis, sondern den ersten Preis aus den 3 Datensätzen.

Produkt, letztes Datum, bester Preis. Wähle 2. Wenn Du zu einem Produkt den besten Preis wissen willst, ist das Datum egal. Wenn Du zu einem Produkt das letzte Datum wissen willst, ist der Preis egal. Deine Annahme, daß zum letzten Datum der beste Preis gilt, ist nur manchmal richtig. Oft aber falsch. Und der beste Preis ist vermutlich auch selten zum letzten Datum. Einfach mal für ca. 2 Cent nachdenken.

Jetzt könnte ich mir für den passenden Preis mit einer Unterabfrage helfen, aber das macht die Sache auch sehr langsam.

Die Gebrechen von MySQL sind hier nichtdas Thema.

Die obige SQL habe ich bekommen, nachdem ich mein Select in HeidiSQL als View eingefügt habe.
Heidi hat das dann mittels Joins 'optimiert'

Deine Heidi ist nur ein dummer Client. Das sieht man schon am SQL, was da, wie Du sagst, unten rausfiel.
 
Zuletzt bearbeitet von einem Moderator:
Produkt, letztes Datum, bester Preis. Wähle 2. Wenn Du zu einem Produkt den besten Preis wissen willst, ist das Datum egal. Wenn Du zu einem Produkt das letzte Datum wissen willst, ist der Preis egal. Deine Annahme, daß zum letzten Datum der beste Preis gilt, ist nur manchmal richtig. Oft aber falsch. Und der beste Preis ist vermutlich auch selten zum letzten Datum. Einfach mal für ca. 2 Cent nachdenken.

Hmmm...
Ich habe nirgends geschrieben, daß ich davon ausgehe, dass der BESTE Preis zum letzten Datum passt.
Ich suche, wie mehrfach geschrieben, den jeweils PASSENDEN Preis zum LETZTEN Datum.
Einfach mal ordentlich lesen, nichts unterstellen und Hohn und Spott beiseite lassen.
Macht einen gleich viel symphatischer
Ach ja, Und für ca. 2 Cent nachdenken.:p

Ich habe das Problem übrigens inzwischen mit einer Unterabfrage gelöst.
Dank dir für deine tatkräftige Unterstützung.:D
 
Werbung:
Zurück
Oben