Kleinster Wert aus mehreren Tabellen
Preise und Bestände von mehreren Lieferanten sind in verschiedenen Tabellen. Ich will in einer Tabelle alle Artikel mit dem jeweils günstigsten EK und entsprechenden Lieferant ausgeben.
Bin wirklich noch kein absoluter Fachmann in PHP und MySQL, aber ich hab mich bis jetzt relativ gut durchgeackert.
Leider habe ich im Moment keine wirklich gute Lösung für das o.g. Problem.
Zwar könnte ich das mit etlichen if-Verzweigungen machen, was aber viel zu kompliziert und umfangreich ist. Sicher gibt es da eine elegantere Lösung.
Ich habe jeweils die Lieferanten-Tabellen (5 Stück) mit folgendem Aufbau (vereinfacht dargestellt)
ean,preis,bestand
und eine Artikeldatei
ean,bezeichnung
Die Ausgabe Tabelle sollte dann folgende Spalten haben:
- bezeichnung
- günstigster EK
- entsprechender Lieferant
Kann mir da jemand weiterhelfen?
Es gibt zwar hier einen Beitrag
MySQL - Kleinster Wert aus mehreren Tabellen
aber irgendwie verstehe ich da die Syntax nicht so wirklich.
Gibt es da vielleicht eine Funktion ähnlich wie bei Excel
min(lieferantA.ek,lieferantB.ek,lieferantC.ek...)
aber wie komme ich dann nachher an den Lieferanten-Namen und Bestand?
Würde mich sehr freuen, wenn mir jemand helfen könnte.
Gruß
John
Bin wirklich noch kein absoluter Fachmann in PHP und MySQL, aber ich hab mich bis jetzt relativ gut durchgeackert.
Leider habe ich im Moment keine wirklich gute Lösung für das o.g. Problem.
Zwar könnte ich das mit etlichen if-Verzweigungen machen, was aber viel zu kompliziert und umfangreich ist. Sicher gibt es da eine elegantere Lösung.
Ich habe jeweils die Lieferanten-Tabellen (5 Stück) mit folgendem Aufbau (vereinfacht dargestellt)
ean,preis,bestand
und eine Artikeldatei
ean,bezeichnung
Die Ausgabe Tabelle sollte dann folgende Spalten haben:
- bezeichnung
- günstigster EK
- entsprechender Lieferant
Kann mir da jemand weiterhelfen?
Es gibt zwar hier einen Beitrag
MySQL - Kleinster Wert aus mehreren Tabellen
aber irgendwie verstehe ich da die Syntax nicht so wirklich.
Gibt es da vielleicht eine Funktion ähnlich wie bei Excel
min(lieferantA.ek,lieferantB.ek,lieferantC.ek...)
aber wie komme ich dann nachher an den Lieferanten-Namen und Bestand?
Würde mich sehr freuen, wenn mir jemand helfen könnte.
Gruß
John
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 97503
Url: https://administrator.de/contentid/97503
Ausgedruckt am: 16.11.2024 um 13:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo John,
in MySQL würde ich die Anfrage so schreiben:
SELECT artikel.bezeichnung, artikel.ean, liefernat.name, MIN(lieferant.preis) as EK FROM artikel JOIN lieferant ON artikel.ean = lieferant.ean GROUP BY artikel.ean
Das gilt für eine Lieferantentabelle mit der Annahme, dass du noch lieferant.name etc. dort hast.
Wenn du 5 Tabellen hast, dann musst du mit UNION arbeiten und somit bekommst du auch dort den Min.Preis heraus.
in MySQL würde ich die Anfrage so schreiben:
SELECT artikel.bezeichnung, artikel.ean, liefernat.name, MIN(lieferant.preis) as EK FROM artikel JOIN lieferant ON artikel.ean = lieferant.ean GROUP BY artikel.ean
Das gilt für eine Lieferantentabelle mit der Annahme, dass du noch lieferant.name etc. dort hast.
Wenn du 5 Tabellen hast, dann musst du mit UNION arbeiten und somit bekommst du auch dort den Min.Preis heraus.
Moin alterVerwalter,
natürlich sieht das ein bisschen merkwürdig aus, wenn Du dort meterlang denselben Lieferantennamen in einer Spalte stehen hast. Hilft aber nichts - Du brauchst je Datensatz ja die information, aus welcher Quelltabelle (oder von welchem Lieferanten) dieser Satz stammt.
In dem o.a. Parallelthread bin ich den Weg gegangen, statt einer Prosa/Langtext-Information (Lieferantenname) besser eine Quelltabelleninfo der Form "T1" für "Herkunft:Tabelle 1", "T2" für ...etc mit in den Resultset einzubauen.
Eine andere Variante wäre statt Liefanten-Name meinetwegen ein Liefantenkürzel (A, B, C, D, E) oder ähnlich - Du hast ja abzählbar wenige Lieferantentabellen.
Grüße
Biber
[Edit] Nachtrag zur letzten Frage:
natürlich sieht das ein bisschen merkwürdig aus, wenn Du dort meterlang denselben Lieferantennamen in einer Spalte stehen hast. Hilft aber nichts - Du brauchst je Datensatz ja die information, aus welcher Quelltabelle (oder von welchem Lieferanten) dieser Satz stammt.
In dem o.a. Parallelthread bin ich den Weg gegangen, statt einer Prosa/Langtext-Information (Lieferantenname) besser eine Quelltabelleninfo der Form "T1" für "Herkunft:Tabelle 1", "T2" für ...etc mit in den Resultset einzubauen.
Eine andere Variante wäre statt Liefanten-Name meinetwegen ein Liefantenkürzel (A, B, C, D, E) oder ähnlich - Du hast ja abzählbar wenige Lieferantentabellen.
Grüße
Biber
[Edit] Nachtrag zur letzten Frage:
select LieferantA.ean,LieferantA.preis, 'LieferantA' as Quelltabelle from LieferantA
union all
select LieferantB.ean,LieferantB.preis, 'LieferantB' from LieferantB
....
Tabellennamen kannst du extra abfragen, aber wenn ich ehrlich bin, dann ist die DB-Schema in deinem Fall eigentlich komplett falsch. Du hast für jeden Lieferanten eine Relation erstellt, die zu einander eigentlich redundant sind. Man soll immer gleiche Daten zu einer Relation (also zu einer Tabelle) zusammen fassen. Daher bekommst grade diese Probleme. Hättest du einfach alle Lieferanten in eine Tabelle gespeichert und diese einfach nach Namen, oder nach Kürzel oder sonst was unterschieden, dann hättest du jetzt mit einer Anfrage wie oben von mir, das Problem auch schon gelöst. Ich würde dir empfehlen das zu überdenken. Ansonsten sieh dazu den Beitrag von Biber. Ich weiß nicht, was bei dir im System noch alles abläuft und warum das so sein soll, aber wenn es möglich ist, würde ich die Daten in eine Tabelle übertragen. Das hilft dir auch für die Zukunft.
Fast, was ich meine wäre folgendes:
Du hast momentan 5 Tabellen mit gleichen Attributen (ean,preis,bestand) und das gleiche eben 5 Mal.
Wenn du jetzt für jeden Lieferanten eine neue Spalte einfügst, macht das ja keinen Sinn, weil mit jedem neuen Lieferanten (angenommen es kommen noch welche dazu), musst du deine Tabelle immer mit mehr Spalten erweitern. Warum? Die Lösung ist doch einfach:
Du machst einfach eine neue Tabelle mit den Attributen (also Spalten): ean,preis,bestand,lieferant
Dort kannst du dann deine Datensätze übertragen aus 5 alten Tabellen, so dass dort steht:
12345 5.99, 200, Cool GmbH <- Hier als Beispiel für Lieferant A
23456 8.98, 100, Schnell GmbH <- Hier als Beispiel für Lieferant B
usw.
So dass du immer nach der Spalte Lieferant unterscheiden kannst, woher die Lieferung kommt.
Noch besser, wenn ich darf wäre eine extra Tabelle für die Lieferanten, so dass du dann diese nur per ID verknüpfst, das spart dir auf jeden Fall DB-Speicherplatz.
dann hättest du zwei Tabellen:
Lieferungen
ean preis bestand liefernant_id
und
Lieferanten
id name email
Also dort kannst du alle Informationen zu deinen 5 Lieferanten abspeichern.
Dann steht in der Tabelle Lieferungen nur noch diese Daten als Beispiel:
12345 5.99 200 1 <- Wobei diese ID für Lieferant A aus der Tabelle Lieferanten steht, wo dann folgende Daten gespeichert sind
1 Lieferant A lieferantA@liefernatADomain.de
Das wäre eine saubere DB-Schema.
Du hast momentan 5 Tabellen mit gleichen Attributen (ean,preis,bestand) und das gleiche eben 5 Mal.
Wenn du jetzt für jeden Lieferanten eine neue Spalte einfügst, macht das ja keinen Sinn, weil mit jedem neuen Lieferanten (angenommen es kommen noch welche dazu), musst du deine Tabelle immer mit mehr Spalten erweitern. Warum? Die Lösung ist doch einfach:
Du machst einfach eine neue Tabelle mit den Attributen (also Spalten): ean,preis,bestand,lieferant
Dort kannst du dann deine Datensätze übertragen aus 5 alten Tabellen, so dass dort steht:
12345 5.99, 200, Cool GmbH <- Hier als Beispiel für Lieferant A
23456 8.98, 100, Schnell GmbH <- Hier als Beispiel für Lieferant B
usw.
So dass du immer nach der Spalte Lieferant unterscheiden kannst, woher die Lieferung kommt.
Noch besser, wenn ich darf wäre eine extra Tabelle für die Lieferanten, so dass du dann diese nur per ID verknüpfst, das spart dir auf jeden Fall DB-Speicherplatz.
dann hättest du zwei Tabellen:
Lieferungen
ean preis bestand liefernant_id
und
Lieferanten
id name email
Also dort kannst du alle Informationen zu deinen 5 Lieferanten abspeichern.
Dann steht in der Tabelle Lieferungen nur noch diese Daten als Beispiel:
12345 5.99 200 1 <- Wobei diese ID für Lieferant A aus der Tabelle Lieferanten steht, wo dann folgende Daten gespeichert sind
1 Lieferant A lieferantA@liefernatADomain.de
Das wäre eine saubere DB-Schema.