Top-Themen

Aktuelle Themen (A bis Z)

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, 5165 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 ..
Ähnliche Inhalte
Datenbanken
Werte aus einer Tabelle ersetzen Werte aus einer anderen Tabelle
Frage von neotm1Datenbanken2 Kommentare

Hallo, ich versuche mit MSSQL eine Abfrage hinzubekommen, in der Werte Aus Tabelle1 Spalte2 in eine andere Tabelle schreibt, ...

Microsoft Office
Werte aus einer Excel Tabelle in eine andere importieren.
gelöst Frage von Enoch23Microsoft Office6 Kommentare

Hallo alle zusammen, seit ca. 2 Stunden suche ich nach einer Lösung für mein Problem, und finde keins. Der ...

Microsoft Office
Werte in einer Tabelle zählen mit Excel
Frage von achkleinMicrosoft Office8 Kommentare

Hallo, ich führe eine Excel-Tabelle mit von mir ausgestellten Rechnungen. In jeder Zelle steht der Name, die Kundennummer und ...

Batch & Shell
CSV kleinerer Wert (Batch)
Frage von jochengBatch & Shell3 Kommentare

Ich habe eine CSV Datei mit folgendem Inhalt: 29664;24,95 29664;12,95 29645;9,95 29645;9,95 29655;12,95 29655;24,95 29664;24,95 29655,12,95 29655,24,95 29664;12,95 29664;24,95 ...

Neue Wissensbeiträge
Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 2 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Sicherheit

Teamviewer Sessions können gekapert werden - Update tw. verfügbar

Information von sabines vor 4 TagenSicherheit6 Kommentare

In bestimmten Konstellationen können Teamviewer Sessions gekapert werden, wahrscheinlich aber ein recht unwahrscheinliches Szenario. Da der Teamviewer gerne für ...

Digitiales Fernsehen

Apple TV: Amazon Prime App ist verfügbar

Information von Frank vor 4 TagenDigitiales Fernsehen4 Kommentare

Die Amazon Prime Video App kann ab sofort auf einem Apple TV ab der 3 Generation installiert werden. Einfach ...

Heiß diskutierte Inhalte
Vmware
Installation Windows 10 VMware
Frage von Ghost108Vmware17 Kommentare

Hallo zusammen, versuche gerade mit Hilfe des vshpere clients eine virtuelle Windows 10 maschine aufzusetzen. 1. virtuelle Maschine erstellt ...

Exchange Server
SBS 2011 E-Mails können gesendet werden, aber nicht von extern empfangen
Frage von andreas1234Exchange Server14 Kommentare

Hallo Community, ich habe das Problem, dass seit knapp zwei Wochen die E-Mails von meinem SBS 2011 einwandfrei gesendet ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Windows Server
Server 2012 über Eingabeaufforderung devmgmt.msc geht nicht
gelöst Frage von achim222Windows Server9 Kommentare

Hallo, ich habe hier einen Server 2012 der im Reparaturmodus startet. Es liegt an einem falschen VirtIO Treiber für ...