AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi mehrere Spalten gleichzeitig "auflösen"
Thema durchsuchen
Ansicht
Themen-Optionen

mehrere Spalten gleichzeitig "auflösen"

Ein Thema von Mongfice · begonnen am 5. Jun 2009 · letzter Beitrag vom 8. Jun 2009
Antwort Antwort
Mongfice

Registriert seit: 26. Feb 2009
40 Beiträge
 
Delphi 7 Professional
 
#1

mehrere Spalten gleichzeitig "auflösen"

  Alt 5. Jun 2009, 15:36
Datenbank: MySQL • Version: 6.0 • Zugriff über: MyDAC
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 ).
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:
Select A.Kundennummer, B.Buchtitel
from Kunden A, Buecher B
where A.Kundenummer = 0815
AND A.Buch1 = B.ID
Um direkt zwei Spalten zu übersetzten habe ich (testweise) dann nochmal Buecher reingepackt, also

SQL-Code:
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
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...

Hab mir dann gedacht, klar, ich mach ne Select-Abfrage über die drei einzelnen Abfragen, sprich

SELECT * from (UbersersetungA) A, (ÜbersetzungB) B, (ÜbersetzungC) C (ich weiß, dass ich dann 3x die Kundennummer habe, das ist nur zur Verkürzten Darstellung hier)
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: mehrere Spalten gleichzeitig "auflösen"

  Alt 5. Jun 2009, 16:04
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: mehrere Spalten gleichzeitig "auflösen"

  Alt 5. Jun 2009, 16:21
Hallo,

mit dem SQL-Server habe ich das gerade mal so gelöst (keine Ahnung, ob das auf MySql übertragbar ist).
SQL-Code:
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
Das Ergebnis sieht dann so aus:
Code:
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
Die Tabelle Kunden
Code:
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
Die Tabelle Buch
Code:
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
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: mehrere Spalten gleichzeitig "auflösen"

  Alt 6. Jun 2009, 11:30
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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Mongfice

Registriert seit: 26. Feb 2009
40 Beiträge
 
Delphi 7 Professional
 
#5

Re: mehrere Spalten gleichzeitig "auflösen"

  Alt 8. Jun 2009, 08:12
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz