Datenverwandtschaft in PHP
Nehmen wir an, wir stehen vor der Aufgabe, Väter und Söhne zu speichern. Nehmen wir an, jeder Vater kann nur einen Sohn haben, und der Sohn seinerseits kann auch einen Sohn haben.
Wir müssen uns überlegen, wie wir die Daten speichern.
Die erste Idee, die einem in den Sinn kommen könnte
- zwei Tabellen erstellen: parents für
die Väter und sons für die Söhne. Dann diese
Tabellen mit einem Feld verbinden: son_id
oder parent_id.
Allerdings ist diese Idee nicht sehr gut - denn dieselbe Person kann gleichzeitig sowohl Vater als auch Sohn sein - und müsste dann in beiden Tabellen gespeichert werden, was unpraktisch ist, mehr Platz beansprucht und leicht zu Fehlern führt.
Eine bessere Variante ist, die Tabelle mit sich selbst
zu verbinden: Wir erstellen eine Tabelle users,
speichern dort alle Benutzer und weisen jedem ein
Feld son_id zu, in dem die
id des Sohnes aus derselben Tabelle gespeichert wird:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Abfragen
Schreiben wir nun eine Abfrage, die den Benutzer zusammen mit seinem Sohn abruft.
Lassen Sie uns zunächst einfach die Benutzer abrufen:
SELECT
*
FROM
users
Jetzt joinen wir ihre Söhne zu den Benutzern. Wir joinen die Tabelle mit sich selbst, daher müssen wir sie umbenennen:
LEFT JOIN users as sons
Nun können wir die Beziehung der Haupttabelle und der umbenannten Tabelle angeben:
LEFT JOIN users as sons ON sons.id=users.son_id
Geben wir nun die Felder an:
SELECT
users.name as user_name, sons.name as son_name
Setzen wir alles zusammen und erhalten die folgende Abfrage:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktische Aufgaben
Nehmen wir an, wir haben Kategorien. Jede Kategorie kann zu einer übergeordneten Kategorie gehören, diese wiederum zu ihrer übergeordneten Kategorie und so weiter. Beschreiben Sie die Speicherstruktur.
Schreiben Sie eine Abfrage, die eine Kategorie zusammen mit ihrer übergeordneten Kategorie abruft.
Schreiben Sie eine Abfrage, die eine Kategorie zusammen mit ihrem Elternteil und Großelternteil abruft.
Schreiben Sie eine Abfrage, die eine Kategorie zusammen mit ihrem Elternteil, Großelternteil und Urgroßelternteil abruft.