Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Kleinster Wert aus mehreren Tabellen

Frage Entwicklung Datenbanken

Mitglied: alterVerwalter

alterVerwalter (Level 1) - Jetzt verbinden

22.09.2008, aktualisiert 17.10.2012, 5105 Aufrufe, 8 Kommentare

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
http://www.administrator.de/frage/mysql-kleinster-wert-aus-mehreren-tab ...

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
Mitglied: dtzzzzzz
22.09.2008 um 15:50 Uhr
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.
Bitte warten ..
Mitglied: alterVerwalter
23.09.2008 um 08:31 Uhr
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:

01.
select LieferantA.ean,LieferantA.preis from LieferantA  
02.
union all 
03.
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.
Bitte warten ..
Mitglied: Biber
23.09.2008 um 09:09 Uhr
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:
01.
select LieferantA.ean,LieferantA.preis, 'LieferantA' as Quelltabelle from LieferantA  
02.
union all 
03.
select LieferantB.ean,LieferantB.preis, 'LieferantB'  from LieferantB 
04.
....
Bitte warten ..
Mitglied: alterVerwalter
23.09.2008 um 09:11 Uhr
Gibt es vielleicht eine Möglichkeit den Tabellennamen mit auszugeben, dieser ist immer identisch dem Lieferantennamen?
Bitte warten ..
Mitglied: dtzzzzzz
23.09.2008 um 09:49 Uhr
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.
Bitte warten ..
Mitglied: alterVerwalter
23.09.2008 um 09:54 Uhr
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
Bitte warten ..
Mitglied: dtzzzzzz
23.09.2008 um 10:29 Uhr
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.
Bitte warten ..
Mitglied: alterVerwalter
23.09.2008 um 11:40 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...

DSL, VDSL
DSL-Signal bewerten (8)

Frage von SarekHL zum Thema DSL, VDSL ...