Eine Tabelle mit sich selbst verbinden
Die Spalte geworben_von in kunden enthält die ID des Kunden, der den Shop weiterempfohlen hat. Sie ist ein Fremdschlüssel wie jeder andere, nur dass sie auf dieselbe Tabelle zeigt: Ein Kunde zeigt auf einen anderen. Um zu sehen, wer wem den Shop empfohlen hat, brauchst du zwei Zeilen von kunden nebeneinander, den Kunden und den, der ihn geworben hat. Du verbindest kunden also mit sich selbst:
SELECT werb.name AS werber, k.name AS kunde
FROM kunden AS k
JOIN kunden AS werb ON k.geworben_von = werb.id
ORDER BY werb.name, k.name;| werber | kunde |
|---|---|
| Emma Becker | Lukas Neumann |
| Emma Becker | Olivia Braun |
| Greta Hoffmann | Sophie Arnold |
| Jonas Hartmann | Leon Wagner |
| … | … |
Ein Self-Join benutzt dieselbe Tabelle zweimal, unter zwei Aliasen, und die Datenbank behandelt sie wie zwei getrennte Tabellen, die zufällig dieselben Zeilen haben. k ist der Kunde, werb der, der ihn geworben hat, und ON paart jeden Kunden mit der Zeile, deren id sein geworben_von ist. Hier sind die Aliase nicht nur kürzer: Sie sind die einzige Möglichkeit zu sagen, welche der beiden Kopien du meinst, denn kunden.name könnte beide sein. Gib ihnen Namen, die sagen, welche Rolle jede Kopie spielt.
Alles andere funktioniert wie in jedem Join. Die Kunden, deren geworben_von NULL ist, haben kein Gegenstück gefunden, JOIN hat sie also weggelassen; LEFT JOIN würde sie behalten. Und mit GROUP BY kannst du zum Beispiel zählen, wie viele Leute jeder Kunde in den Shop gebracht hat.
Eine Tabelle lässt sich auch mit einer anderen Bedingung als einem Fremdschlüssel mit sich selbst verbinden. Welche Spiele haben dasselbe Genre? Paare jedes Spiel mit den anderen Spielen, deren genre gleich ist:
SELECT s1.titel, s2.titel AS gleiches_genre
FROM spiele AS s1
JOIN spiele AS s2 ON s1.genre = s2.genre AND s1.id < s2.id
WHERE s1.genre = 'Strategie'
ORDER BY s1.titel, s2.titel;| titel | gleiches_genre |
|---|---|
| Castle Siege | Galaxy Trader |
| Castle Siege | Tiny Kingdoms |
| Tiny Kingdoms | Galaxy Trader |
s1.id < s2.id (ON kann mehrere Bedingungen haben, die mit AND verknüpft sind) behält jedes Paar nur einmal und paart nie ein Spiel mit sich selbst. Ohne sie bekämst du Castle Siege mit Castle Siege sowie sowohl Castle Siege mit Tiny Kingdoms als auch Tiny Kingdoms mit Castle Siege.
So schreibst du es:
Anweisungen
- 1
Zeige jeden Kunden mit dem Namen des Kunden, der ihn geworben hat, auch die Kunden, die niemand geworben hat: die Spalten
kundeundwerber, sortiert nachkunde:kunde werber Anna Fischer Olivia Braun Emma Becker NULL Greta Hoffmann Olivia Braun Hannes Schulz NULL … … - 2
Zeige darunter, wie viele Kunden jeder Kunde geworben hat:
werberund die Zahl alsgeworben, nur für die, die jemanden geworben haben. Sortiere sie nachgeworbenvom höchsten Wert, dann nachwerber:werber geworben Emma Becker 2 Olivia Braun 2 Greta Hoffmann 1 Jonas Hartmann 1 Lukas Neumann 1 Mia Lange 1 - 3
Und wer wohnt in derselben Stadt wie der Kunde, der ihn geworben hat? Zeige
kunde,werberund ihrestadt, sortiert nachkunde:kunde werber stadt Greta Hoffmann Olivia Braun Hamburg Jonas Hartmann Lukas Neumann Leipzig Olivia Braun Emma Becker Hamburg Oskar Klein Mia Lange Berlin