alterverwalter
Goto Top

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

Content-Key: 97503

Url: https://administrator.de/contentid/97503

Printed on: April 25, 2024 at 17:04 o'clock

Member: dtzzzzzz
dtzzzzzz Sep 22, 2008 at 13:50:37 (UTC)
Goto Top
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.
Member: alterVerwalter
alterVerwalter Sep 23, 2008 at 06:31:53 (UTC)
Goto Top
Vielen Dank schonmal.

okey, mit dem union habe ich mich noch gar nicht beschäftigt, damit scheint es zu klappen.
Aber ist die Lösung, dass in jedem Datensatz einer Lieferantentabelle auch noch der Lieferantenname stehen muss wirklich so gut?
Das wäre dann innerhalb einer Tabelle eine Spalte in der überall das gleiche steht...

Was gibt es da noch für Möglichkeiten?


Edit:
Ich hab mal folgende einfache Abfrage erstellt:

select LieferantA.ean,LieferantA.preis from LieferantA 
union all
select LieferantB.ean,LieferantB.preis from LieferantB

Jedoch fängt er dann an zu rechnen und hört nicht mehr auf. Und das bei nur bei 2 Lieferanten (von 5) und ohne eigentliche Artikeldaten.
Jede Lieferantentabelle hat ca. 2000-3000 Datensätze.
Member: Biber
Biber Sep 23, 2008 at 07:09:45 (UTC)
Goto Top
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:
select LieferantA.ean,LieferantA.preis, 'LieferantA' as Quelltabelle from LieferantA   
union all
select LieferantB.ean,LieferantB.preis, 'LieferantB'  from LieferantB  
....
Member: alterVerwalter
alterVerwalter Sep 23, 2008 at 07:11:39 (UTC)
Goto Top
Gibt es vielleicht eine Möglichkeit den Tabellennamen mit auszugeben, dieser ist immer identisch dem Lieferantennamen?
Member: dtzzzzzz
dtzzzzzz Sep 23, 2008 at 07:49:52 (UTC)
Goto Top
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.
Member: alterVerwalter
alterVerwalter Sep 23, 2008 at 07:54:56 (UTC)
Goto Top
ach stimmt, du meinst eine tabelle mit allen artikel und eine spalte für jeden lieferanten, klingt ganz logisch, muss ich zwar meine ganzen importskripte umbauen, macht aber wirklich sinn.

danke
Member: dtzzzzzz
dtzzzzzz Sep 23, 2008 at 08:29:04 (UTC)
Goto Top
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.
Member: alterVerwalter
alterVerwalter Sep 23, 2008 at 09:40:12 (UTC)
Goto Top
das hab ich verstanden und macht wirklich sinn.

sehr gut.
Das macht auch den Import der Dateien einfacher, da nicht überprüft werden muss ob eine bestimmte EAN schon vorhanden ist und demnach hätte unterscheiden müssen ob insert oder update.
So habe ich nur Inserts. Sehr gut.

Vielen Dank

Dann wäre die Sache gelöst.