Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

view auf preis nach letztem datum anzeigen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von SirHarry, 24 Januar 2019.

  1. SirHarry

    SirHarry Neuer Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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!
     
  3. SirHarry

    SirHarry Neuer Benutzer

    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.
    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'
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.

    Die Gebrechen von MySQL sind hier nichtdas Thema.

    Deine Heidi ist nur ein dummer Client. Das sieht man schon am SQL, was da, wie Du sagst, unten rausfiel.
     
    Zuletzt von einem Moderator bearbeitet: 25 Januar 2019
  5. SirHarry

    SirHarry Neuer Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Genau. Das ist das Problem. Lies meine Antwort, und denk drüber nach. Danke für die Bestätigung.

    Andreas
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden