MySQL: Join auf eine Tabelle

Die Überschrift klingt sicher eigenartig, werden Joins doch zum Verbinden mehrerer Tabellen über einen gemeinsamen Schlüssel verwendet.

Wenden wir uns jedoch folgendem Beispiel zu:

Viele Tabellen werden in einer 1:n-Entität erstellt. Dies kann z.b. bei Rechnungslegung der Fall sein, d.h., dass ein Kunde im Laufe seinen Bestelllebens mehrere Einkäufe tätigt. Die Kundenstammdaten werden dann 1:n mit den Bestellungen verknüpft.

Solche Tabellen machen also durchaus Sinn. Was aber, wenn wir eine Tabelle mit einer 1:n-Entität flat, also 1:1 darstellen wollen?

Folgendes einfaches Beipiel einer Adressverwaltung soll euch das veranschaulichen.

Als erstes fällt auf, dass so eine Tabelle sehr chaotisch wirkt, was bei tausenden von Datensätzen und mehr als 4 Merkmalen schlimmer und schlimmer wird.

Tutorial MySQL Join mit 1:n-Tabelle - Beispiel

Machen wir uns also ans Werk und räumen auf:

Wir haben in diesem Beispiel 4 Merkmale (vorname, name, strasse, ort), die wir zu bearbeiten haben.

Wir beginnen mit

SELECT
a.eigenschaft AS Vorname,
b.eigenschaft AS Name,
c.eigenschaft AS Straße,
d.eigenschaft AS Ort

Wir wollen also diese Eigenschaften ausgeben. Weiter geht es mit

FROM
tabelle2 a
LEFT JOIN tabelle2 b ON a.id = b.id
LEFT JOIN tabelle2 c ON a.id = c.id
LEFT JOIN tabelle2 d ON a.id = d.id

Wir verknüpfen also ein und dieselbe Tabelle mit sich selbst!

Darauf folgt

WHERE
a.merkmal = 'vorname' AND
b.merkmal = 'name' AND
c.merkmal = 'strasse' AND
d.merkmal = 'ort';

Wir weisen hier den Spalten den entsprechenden Wert zu, That's it!

Als Ergebnis erhalten wir:

Tutorial MySQL Join mit 1:n-Tabelle - Ergebnis

Das ist also die ganze Hexerei. Hier nochmals der gesamte Quellcode:

SELECT
a.eigenschaft AS Vorname,
b.eigenschaft AS Name,
c.eigenschaft AS Straße,
d.eigenschaft AS Ort
FROM
tabelle2 a
LEFT JOIN tabelle2 b ON a.id = b.id
LEFT JOIN tabelle2 c ON a.id = c.id
LEFT JOIN tabelle2 d ON a.id = d.id
WHERE
a.merkmal = 'vorname' AND
b.merkmal = 'name' AND
c.merkmal = 'strasse' AND
d.merkmal = 'ort';

Das kann man mit beliebig vielen Merkmalen machen, stellt dann jedoch eine mühselige Tipperei dar. Ich empfehle euch daher, ein kleines php-Programm zu schreiben, das euch den MySQL-Quellcode ausgibt.

Solltest ihr daran Interesse haben, so schreibt mir einfach. Ich werde dann gern ein kleines Tool dafür schreiben.


« zurück