Sagen wir, wir wollen ein Gildensystem schreiben. Um einen User mit einer Gilde zu assoziieren, schreiben wir einfach die Gilden-ID in die Account-Tabelle. Im Prinzip nicht falsch, aber wir laden eigentlich überflüssigen Text in die aktuelle Sitzung. Um das zu verhindern, können wir, anstatt 2 Tabellen ("accounts" und "guilds") auf 3 ausweichen:
- accounts
- guild_members
- guilds
In der Tabelle "guild_members" stehen dabei zum Beispiel Rang, Account-ID und Gilden-ID mit einander verbunden.
Nun ist es aber schwieriger, von einem Spieler auf dessen Gildenzugehörigkeit zu schliessen. Doch es ist nicht unmöglich, ein etwas komplexerer Query hilft uns dabei:
Code:
SELECT a.`name`, g.`name` AS `guildname` FROM `accounts` a
LEFT OUTER JOIN `guild_members` gm ON a.`acctid` = gm.acctid
LEFT JOIN `guilds` g ON gm.guildid = g.guildid
Dieser Query holt zuerst einmal alle Accounts. Dann versucht er, wo möglich, die mit der Tabelle "guild_members" zu verbinden. Wenn keine Verbindung möglich kist (Keine Gildenmitgliedschaft), bekommen alle Felder, die nicht aus der Tabelle "accounts" stammen, den Wert
NULL (Nichts, nicht 0!). Weiterhin verbindet er explizit mit der Tabelle "guilds", um den Namen zu holen. Existiert die Gilde nicht (Irgendwas schiefgelaufen?), so bekommen ebenfalls alle Werte, die nicht aus der "accounts" stammen, den Wert
NULL.
Weitere Fragen zur Verarbeitung solcher 3er-Verknüpfungen? Schreib mich mit der Frage an und ich beantworte sie hier!