![]() |
Datenbank: MySQL • Version: 6.0 • Zugriff über: MyDAC
mehrere Spalten gleichzeitig "auflösen"
Moin,
ich hab ein Problem... - evtl. bin ich auch einfach nur zu blöd grad... Ich habe zwei Datenbanktabellen, sagen wir Kunde und Bücher (um das ganze mal auf nen Verständliches Szenario zu bringen :lol: ). In der Tabelle Kunde sind die Kundendaten gespeichert, sowie die Daten welche Bücher ein Kunde ausgeliehen hat. Jeder Kunde darf maximal 3 Bücher entleihen, dafür gibt es drei Spalten, Buch1, Buch2 und Buch3. In der Büchertabelle sind eben die Daten des Buches gespeichert. Jetzt hinterlege ich in der Kundentabelle in den entsprechenden Spalten die ID des Buches, welches er entliehen hat - jede Spalte kann also ggf. auch leer sein. Das Problem, was ich grad irgendwie nicht gelöst bekomme, ist wie ich die ID der Bücher z.B. auf den Titel übersetzt bekomme... Für eine einzelne der Spalten hab ich folgendes gemacht:
SQL-Code:
Um direkt zwei Spalten zu übersetzten habe ich (testweise) dann nochmal Buecher reingepackt, also
Select A.Kundennummer, B.Buchtitel
from Kunden A, Buecher B where A.Kundenummer = 0815 AND A.Buch1 = B.ID
SQL-Code:
das geht zwar noch, aber dauer schon ewig (die Tabellen sind nicht gerade klein). Auf diese Weise alle 3 Spalten gleichzeitig übersetzen zu wollen macht aber der SQL-Server schon nicht mehr mit...
Select A.Kundennummer, B.Buchtitel, C.Buchtitel
from Kunden A, Buecher B, Buecher C where A.Kundenummer = 0815 AND A.Buch1 = B.ID AND A.Buch2 = C.ID Hab mir dann gedacht, klar, ich mach ne Select-Abfrage über die drei einzelnen Abfragen, sprich
SQL-Code:
(ich weiß, dass ich dann 3x die Kundennummer habe, das ist nur zur Verkürzten Darstellung hier)
SELECT * from (UbersersetungA) A, (ÜbersetzungB) B, (ÜbersetzungC) C
Leider funktioniert das nur, wenn auch wirklich 3 Bücher entliehen sind. Ist einer der Einträge "null", dann bekomme ich gar keine Zeile zurück. Kann mir da evtl. jemand nen Tip geben, wie ich auch die nen Ergebnis bekomme, wenn eine der Spalten "null" ist? Brauch halt an sich etwas, das hinterher so aussieht: Kundennummer | Buch1 | Buch2 | Buch3 Liebe Grüße Mongfice |
Re: mehrere Spalten gleichzeitig "auflösen"
Willst du wirklich nur maximal 3 Bücher pro Kunde zulassen? Oder willst du da noch mehr Spalten in Kunde einfügen? Wie wäre es mit einer M:N-Beziehung?
Weitere Stichwörter sind OUTER JOIN und GROUP_CONCAT. |
Re: mehrere Spalten gleichzeitig "auflösen"
Hallo,
mit dem SQL-Server habe ich das gerade mal so gelöst (keine Ahnung, ob das auf MySql übertragbar ist).
SQL-Code:
Das Ergebnis sieht dann so aus:
create table kunde(
id integer, Name VarChar(20), Buch1 integer, buch2 integer, buch3 integer ); create table buch( id integer, titel varchar(20) ); select Name, Max(TitelBuch1) As TitelBuch1, Max(TitelBuch2) As TitelBuch2, Max(TitelBuch3) As TitelBuch3 from ( select Name, buch.Titel as TitelBuch1, '' As TitelBuch2,'' as TitelBuch3 from Kunde, buch where kunde.buch1 = buch.id union all select Name, '' as TitelBuch1, buch.Titel As TitelBuch2,'' as TitelBuch3 from Kunde, buch where kunde.buch2 = buch.id union all select Name, '' as TitelBuch1, '' As TitelBuch2, buch.Titel as TitelBuch3 from Kunde, buch where kunde.buch3 = buch.id ) xxx group by name
Code:
Die Tabelle Kunden
Name|TitelBuch1|TitelBuch2|TitelBuch3
Kunde1|Buch 1|Buch 6|Buch 11 Kunde2|Buch 2|Buch 7|Buch 12 Kunde3|Buch 3|Buch 8|Buch 13 Kunde4|Buch 4|Buch 9|Buch 14 Kunde5|Buch 5|Buch 10|Buch 15
Code:
Die Tabelle Buch
id|Name|Buch1|Buch2|Buch3
1|Kunde1|1|6|11 2|Kunde2|2|7|12 3|Kunde3|3|8|13 4|Kunde4|4|9|14 5|Kunde5|5|10|15
Code:
Allerdings dürfte das Einfügen einer zusätzlichen Tabelle zwischen Kunde und Buch sinnvoller sein, damit auch mehr Bücher möglich sind. Da Kunde und Buch hier ja nur als Beispiel genannt sind, mag das für die tatsächliche Aufgabenstellung anders aussehen.
id|titel
1|Buch 1 2|Buch 2 3|Buch 3 4|Buch 4 5|Buch 5 6|Buch 6 7|Buch 7 8|Buch 8 9|Buch 9 10|Buch 10 11|Buch 11 12|Buch 12 13|Buch 13 14|Buch 14 15|Buch 15 |
Re: mehrere Spalten gleichzeitig "auflösen"
Das geht aber einfacher:
SQL-Code:
select Name,
b1.Title As TitelBuch1, b2.Title As TitelBuch2, b3.Title As TitelBuch3 from Kunde k left join Buch b1 on k.buch1 = b1.id left join Buch b2 on k.buch1 = b2.id left join Buch b3 on k.buch1 = b3.id |
Re: mehrere Spalten gleichzeitig "auflösen"
Moin!
Erstmal entschuldigung, dass ich jetzt erst wieder antworte, war über's Wochenende weg. Das mit den 3 "Büchern" ist wie gesagt nur ein Beispiel. In der tatsächlichen Aufgabenstellung kommen nur 3 solcher Spalten vor, und es wäre zwar denkbar dass es ggf. mal angepasst werden könnte, dies ist aber a) sehr unwahrscheinlich und b) auch vom ganzen sonstigen Aufbau her sehr aufwendig, da würde das einfügen einer neuen Tabelle für die Verbindung dann nicht mehr ins Gewicht fallen. Vielen Dankn an alzaimar, die Lösung funktioniert super. Ich glaub was die Joins angeht hab ich entweder irgendwas falsch verstanden oder zu kompliziert gedacht. Hab das selbst nicht hinbekommen obwohl es doch so einfach ist. :-( |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz