# MySQL - Tabellen für mehrere Werte verknüpfen



## darkpriest (7. Juni 2009)

Hallo,

ich habe folgendes Problem:

Tabelle 1 enthält eine Provisionssystem-Historie mit folgendem Aufbau:

Id, gueltig_von, gueltig_bis, mitarbeiter, provnw, provgw

Tabelle 2 enthält die Provisions-Systeme:

Id bezeichnung wert

Mein Problem ist nun, dass ich keinen Select hinbekomme, der mir die bezeichnung aus Tabelle2 für die Werte provnw und provgw liefert. Ich bekomme immer maximal einmal die bezeichnung.

Wer kann mir hier weiterhelfen oder einen Tipp geben?

Danke!

Darkpriest


----------



## Biber2 (7. Juni 2009)

Moin darkpriest,

halte mich nicht für neugierig, aber... gibt es denn auch irgendeine aus Deiner Sicht erwähnenswerte _ logische _ Beziehung zwischen den Feldern in Tabelle A und B?

Meine Kristallkugel behauptet zwar, provnw und provgw könnten ForeignKeys in TabelleA sein, an denen  in Tabelle B die Bezeichnung "Provision für Nachtwächter" und "Provison für Grillwürstchen" hängt und für die in Tabelle B ein Prozentsatz in Feld "wert" hinterlegt ist...

Aber -hey!-wieso sollte ich auf eine Kristallkugel hören

Wenn es so wäre, dann brauchst Du zwei Joins 

```
SELECT a.Id, a.gueltig_von, a.gueltig_bis, 
                a.mitarbeiter, 
                b. bezeichnung as provnwBez,
                c. bezeichnung as provgwBez,
FROM tabelleA a,  TabelleB as b, TabelleB as c
              where    a.provnw = b.ID
             and a.provgw = c.ID
Order by  1
```

Das würde einem "normalen" JOIN entsprechen, d.h. für jedes Feld provgw und provmw in TabelleA wird ein Wert <> NULL erwartet -jeder Satz hat sowohl einen provgw wie provnw-Wert.

Grüße
Biber


----------



## Bratkartoffel (7. Juni 2009)

Hi,

wie hängen denn die beiden Tabellen zusammen? Also Fremd- und Primärschlüssel wären hilfreich 

Gruß
BK

// Edit: OK, da war einer schneller, mal schauen ob seine Lösung stimmt


----------



## darkpriest (8. Juni 2009)

Hallo,

vielen Dank für eure Antworten.

zu Biber2: Deine Glaskugel hat völlig recht. In der Tabelle "prov_historie" sind Werte für provnw und provgw hinterlegt! Die Bezeichungen für diese Werte finden sich in der Tabelle "prov_systeme". Weiterhin befindet sich in der Tabele "prov_historie" noch ein Wert für den Mitarbeiter, dessen Name in der Tabelle "personal" hinterlegt ist.

Ich hoffe ich konnte den Zusammenhang zwischen den 3 Tabellen erklären. Wo ich scheitere ist der Punkt, das ich 2 Bezeichnungen für Prov.-Systeme erhalten muß. da diese unterschiedlich sein können!

Wenn ich deine Antwort richtig verstanden habe, benötige ich einen anderen Select!

Vielen Dank für eure Hilfe

Michi


----------



## Biber2 (8. Juni 2009)

Moin Dunkelpastor,

wenn Du in meine obige Skizze für "TabelleB" den String "prov_systeme" einsetzt und für "TabelleA" "prov_historie", dann sollten die "Provisonssystembezeichnungen" passen.

Allerdings steht der "wert" doch wohl nicht in der "prov_system"--tabelle, sondern ist MA-und-Zeitraum-abhängig und steht in der "personal"-Tabelle?

Lass uns Deine erste Tabellenbeschreibung einfach vergessen - poste doch einfach mal die echte.
Oder wenigstens die relevanten Felder davon, so wie sie auch in den CREATE-DDLs definiert sind.

Grüße
Biber


----------



## darkpriest (8. Juni 2009)

Hallo an den Biber,

danke für deine schnelle Antwort! Ich versuche mal den Zusammenhang der 3 Tabellen besser darzustellen bzw. zu erklären:

1. prov_systeme: hier stehen nur die bezeichnung (z. B. System 2006) und ein dem jeweiligen System zugeordneter Wert (z. B. 10)

2. prov_historie: hier stehen die Felder gueltig_von, gueltig_bis, provnw, provgw, mitarbeiter (nur als Id von der Tabelle "Personal").

3. Personal: Hieraus nur die Felder name u. vorname

Ich möchte nun die Werte so ermitteln, dass ich die Felder "gueltig_von, gueltig_bis, provnw.bezeichnung, provgw.bezeichnung und den namen bekomme"

Der Wert aus prov_systeme findet sich in prov_historie in den Feldern provnw und provgw wieder!

Die Id aus der Tabelle "personal" findet sich in der Tabelle prov_historie wieder! In der Tabelle "personal" finden sich nur die aktuellen Prov.-Systeme wieder, diese sind aber auch schon in prov_historie enthalten!

Ich hoffe du  kannst mit meiner erklärung was anfangen!

Danke!

Michi


----------



## darkpriest (11. Juni 2009)

Hallo,

ich versuche mein Problem nochmals besser zu erklären. Mein Problem beruht darauf, dass ich Daten aus 3 Tabellen zusammenführen möchte.

Die 1. Tabelle prov_historie enthält die Spalten provnw und provgw.

Die 2. Tabelle prov_systeme enthält die Spalte bezeichung und wert

Die 3. Tabelle personal enthält den Namen des Mitarbeiters.

Die 1. u. die 3. Tabelle lassen sich über die Id ohne Probleme miteinander verbinden.

Die Tabelle 2 enthält aber in der Spalte bezeichnung, sowohl die bezeichnung für die Spalte provnw und auch die bezeichnung für provgw; unterschieden wird hier über die Spalte wert. Die Spalte wert findet sich wieder in der Tabelle 1 in den Spalten provnw und provgw.

*Und genau das ist mein Problem, dass ich als Ausgabe in einem Datensatz 2 Bezeichnungen erhalten müßte; nämlich Bezeichnung_nw u. Bezeichnung_gw*

Habe schon alles mögliche versucht, komme aber meist nur soweit, dass mir die Datensätze doppelt angezeigt werden.

Bin für jede Hilfe sehr dankbar!

Danke!

Michi


----------



## kuddeldaddeldu (11. Juni 2009)

Hi,

zugegeben, ich verstehe Deinen Tabellenaufbau immer noch nicht wirklich, aber das hier:



darkpriest hat gesagt.:


> Die Tabelle 2 enthält aber in der Spalte bezeichnung, sowohl die bezeichnung für die Spalte provnw und auch die bezeichnung für provgw; unterschieden wird hier über die Spalte wert. Die Spalte wert findet sich wieder in der Tabelle 1 in den Spalten provnw und provgw.



hört sich nach schlechtem DB-Design an. Poste doch mal einen Testdump der Tabellen und Deine Abfrage nebst gewünschtem und tatsächlichem Ergebnis. Vielleicht wird's dann deutlicher.

LG


----------



## darkpriest (11. Juni 2009)

Hallo,

erstmal danke für deine schnelle Antwort.

Ich versuche nochmals das ganze besser zu erklären:

Zuerst habe ich eine Tabelle Provisionssysteme angelegt, die folgende Felder hat:


Id
bezeichnung
wert

Dann habe ich eine Tabelle Provisionshistorie angelegt, die folgende Felder hat:


gueltig_von
gueltig_bis
mitarbeiter
provnw
provgw

Dann habe ich noch die Tabelle personal mit folgenden Feldern:


id
name
vorname

Der wert aus Tabelle 1 findet sich in den Spaten provnw und provgw wieder. Ich habe das deswegen so gemacht, damit ich nur in 1 Tabelle die Prov.-Systeme pflegen muß.

Die id aus der Tabelle personal findet sich auch wieder in der Tabelle Provisionshistorie in der spalte mitarbeiter wieder.

Mein Problem ist es nun, dass jeder mitarbeiter 2 Provisionssysteme hat, eins für neuwagen und ein für gebrauchtwagen, und somit auch 2 verschiedene Bezeichnungen. und diese bekomme ich nicht selektiert!

Ergebnis soll sein, name, vorname, gültig_von, gültig_bis, Bezeichnung_nw, Bezeichnung_gw.

Ich hoffe ich konnte mein Problem darstellen!

Vielen Dank!

Michi


----------



## Biber2 (12. Juni 2009)

Moin Pastor,

wollen wir wirklich da ein SQL zusammenschroten oder lieber erstmal redesignen? ;-)
Dass die Spalte "wert" der _eigentliche_ ForeignKey ist, der mit provnw und provgw verknüft werden muss, das schockiert mich schon etwas.
Dann sind doch "wert" und "id" in Tabelle 1 beides eindeutige Schlüssel, oder überseh ich etwas?
Oder an welcher Stelle in Deinem ganzen Datenuniversum verwendest Du das Feld id in Tabelle1?

Und wie erklärst Du jemandem Dein Datenmodell, wenn jedes PK-Feld in jeder Tabelle physisch "ID" heißt, aber logisch _eigentlich_ provgw oder mitarbeiterID?

Ich sehe ein gewisses Folgerisiko, wenn wir jetzt ein unleserliches (funktionierendes) SQL bauen...
Möglicherweise lässt Du dann das Design so...

Grüße
Biber

P.S. Aber deine geduldige versuchte Erklärung des Modells finde ich trotz alledem vorbildlich.


----------

