Gast: LEFT JOIN - nur ein Satz

Hallo,

in einer Liste zeige ich Artikel an. Zu jedem Artikel kann es 0..n Zu- und Abgangsbuchungen geben.

Die letzte Buchung (=höchstes Datum) möchte ich auch anzeigen, habe aber keine Idee, wie ich diesen einen Satz per JOIN dazubekomme. Oder geht das anders?

Gast

  1. Moin,

    Die letzte Buchung (=höchstes Datum) möchte ich auch anzeigen, habe aber keine Idee, wie ich diesen einen Satz per JOIN dazubekomme. Oder geht das anders?

    Das kommt aufs DBMS und auf die Struktur deiner Tabellen an

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
  2. Tach!

    in einer Liste zeige ich Artikel an. Zu jedem Artikel kann es 0..n Zu- und Abgangsbuchungen geben.
    Die letzte Buchung (=höchstes Datum) möchte ich auch anzeigen,

    Wenn es die nur um das Datum und keine anderen Werte aus der Buchungstabelle geht, dann ist das recht einfach über eine correlated Subquery abfragbar.

    SELECT ..., (SELECT MAX(Datum) FROM buchungen WHERE id_artikel = artikel.id) FROM artikel

    Wenn es mehr Felder sein sollen, dann wird es schwer bis unmöglich, weil es bei einer Gruppierung nicht vorgesehen ist, einen ganzen Datensatz zu liefern.

    Eine Tabelle mit den Feldern a,b,c kann man zwar nach a gruppieren, aber dann kann man von b und c nur aggregierte Werte erhalten. MySQL lässt zwar das Abfragen von b und c zu, aber liefert dann beliebige Werte. Selbst wenn du
    SELECT a, MAX(b), c FROM tabelle GROUP BY a
    abfragst, heißt das nicht, dass du den zum maximalen b gehörenden Wert von geliefert c bekommst.

    dedlfix.

    1. Hallo dedlfix,

      bin dabei, die Warenwirtschaft neu aufzusetzen, die Tabellen entstehen gerade.

      Der aktuelle Bestand soll nicht im Artikelstamm stehen, denn es könnte mehrere Lager geben mit unterschiedlichen Beständen.

      Jeder Buchungssatz hat ein DATETIME Feld, die Buchungsmenge plus/minus sowie den Bestand vor und nach der Buchung.

      Okay, dann muss ich in der Artikelliste wohl pro Position eine SQL-Abfrage wegen der Menge loslassen.

      Gast

      1. Tach!

        Der aktuelle Bestand soll nicht im Artikelstamm stehen, denn es könnte mehrere Lager geben mit unterschiedlichen Beständen.

        Also möchtest du außer dem Datum der neuesten Buchung auch noch den Bestand anzeigen. Beides hat wenig miteinander zu tun. Für das Datum benötigst du den Maximalwert, für die Anzahl eine Summe. Beides könnte in einer eigenen Subquery nach dem gezeigten Muster erfragt werden. In diesem Fall, dass beide interessierenden Werte über eine Aggregatfunktion ermittelt werden, sollte aber auch ein JOIN und ein GROUP BY zum Ziel führen.

        Jeder Buchungssatz hat ein DATETIME Feld, die Buchungsmenge plus/minus sowie den Bestand vor und nach der Buchung.

        Die Mitführung der Bestandsinformation scheint mir nicht nur überflüssig sondern mitunter sogar störend. Nimm mal an, du hast festgestellt, dich bei einer früheren Buchung vertan zu haben. Wie korrigierst du das und welche Auswirkungen ergeben sich dadurch? Wenn Korrekturen nicht erlaubt sind und stattdessen eine Gegen- und erneute Buchung eingetragen werden müssen, ist das sicher kein Problem. Aber wenn du vergangene Buchungen korrigieren kannst, musst du für jede neuere Buchung die Bestandszahlen nachziehen. Und eigentlich ergibt sich dieser Wert bereits durch einfache Berechnung.

        dedlfix.