query aus 3 Datenbanktabellen
kEv*
- php
1 Vinzenz Mai0 kEv*
Hallo liebe SELFHTMLer,
kurz die Struktur der 2 Tabellen.
TBL: player
------------------------------
TBL: clan
-------------
TBL: planeten
---------------------------------------------
So jetzt versuche ich mal zu erklären was ich abfragen möchte.
In der Clanübersicht möchte ich alle Planeten des Clans anzeigen.
Ich übergebe nur die Clan ID via GET.
Um herauszubekommen welche Spieler alle in dem Clan sind starte ich einen query in einer while Schleife mit der TBL:player. In dieser while Schleife kann ich nun alle Planeten ausgeben und auch zählen.
Es muss doch möglich sein dies auch in einem query zu erreichen.
Kann mir eventuell jemand Stichworte zu einer Lösung geben?
Ich glaube das eine Schleife in einer Schleife schon funktioniert, aber doch nicht wirklich sauber programmiert ist.
Wie würdet ihr das Problem lösen?
Eventuell andere Tabellen Struktur?
Für Lösungsansätze und/oder konstruktive Kritik bin ich euch dankbar.
LG
kev1n
Hallo Oliver,
kurz die Struktur der 2 Tabellen.
TBL: player
- id - player - clan - rasse -
- 1 - kev - 1 - pirat -
- 2 - plom - 1 - pirat -
- 3 - plom - 2 - pirat -
Nein, Tabellen sind in aller Regel nach unten offen ...
Es wäre wahrscheinlich sinnvoll, die "Rasse" in eine eigene Tabelle
auszulagern - oder einen ENUM-Datentyp dafür zu verwenden, falls das
von Dir verwendete und unbekannte Datenbankmanagementsystem (DBMS,
so etwas wie Oracle, DB2, MS SQL-Server, PostgreSQL, Sqlite, MS Access
oder vielleicht MySQL oder etwas ganz anderes) diesen Datentyp kennt.
TBL: clan
- id - clan -
- 1 - clan1-
- 2 - clan2-
Diese Tabelle sieht ok aus.
TBL: planeten
- id - planet1 - planet2 - planet3 - player -
- 1 - 123 - 345 - 678 - 1 -
- 2 - 555 - 111 - 888 - 1 -
- 3 - 999 - 777 - 120 - 2 -
Diese Tabelle ist fehlerhaft aufgebaut. Genauer gesagt ist sie
offensichtlich so etwas wie eine Zuordnungstabelle von Spielern
zu Planeten. Deswegen benötigst Du eine eigene Tabelle planeten,
in der nur die direkt von den Planeten abhängigen Daten gespeichert
sind und die es völlig einfach ermöglicht, neue Planeten anzulegen
und eine weitere Tabelle, die die Zuordnung erledigt. Wie das im
einzelnen aussieht, hängt einfach von Deinen Anforderungen ab.
Erläutere bitte die ersten beiden Datensätze. Was sollen diese
Datensätze bedeuten?
Ich übergebe nur die Clan ID via GET.
Das ist für Datenbankfragen völlig unwichtig und uninteressant.
Wie würdet ihr das Problem lösen?
Eventuell andere Tabellen Struktur?
Mit einer sauberen Tabellenstruktur ist es normalerweise kein
Problem, die einem Clan zugeordneten Planeten mit ihren Werten
anzuzeigen.
Was hier fehlt, ist eine klare Erläuterung der Bedeutung des
Inhaltes Deiner Planetentabelle, die grundsätzlich gesehen falsch
aufgebaut ist. Ohne diese Erläuterung kann man Dir meiner Meinung
nach nicht weiterhelfen. Jedenfalls ist es fast immer sinnvoll,
durch sinnvoll aufgebaute Tabellenstrukturen überflüssige
Programmierung in der API zu vermeiden. Wenn Du dort Schleifen
benötigst, um eine Zuordnung zu finden, dann ist das fast immer
ein sicheres Anzeichen dafür, dass die Struktur ungünstig gewählt
ist. Baue daher um.
Freundliche Grüße
Vinzenz
Vielleicht ist die Bezeichung der PLANETENTABELLE e twas schwierig.
Ein Planet setzt sich zusammen aus planet1 UND planet 2 und planet3.
BSP:
111:222:333
oder
12:1:7
oder
1:12:122
und weitere.
Deswegen die PLANETENTABELLE mit
der ID für den Datensatz.
dem PLAYER für die Spielerzuordnung
und den 3 einzelnen Planetenteilen.
Die ClanID via GET ist logischerweise nur um eine Variable zu haben mit der ich mir dann div. Daten aus der DB hole. Das die Variable nichts mit der DB als solches zu tun hat ist mir schon klar.
Hallo
Vielleicht ist die Bezeichung der PLANETENTABELLE e twas schwierig.
Ein Planet setzt sich zusammen aus planet1 UND planet 2 und planet3.
:-)
Schlechte Bezeichnungen. Sehr schlechte Bezeichnungen. Wie soll diese
ein Außenstehender verstehen.
Vielleicht würdest Du bitte anhand Deiner Beispieltabellen die gesuchte Ergebnismenge als Tabelle darstellen. Dann kommen wir vielleicht weiter.
Freundliche Grüße
Vinzenz
Hallo Oliver,
ich versuche es erneut:
TBL: clan
- id - clan -
- 1 - clan1-
- 2 - clan2-
TBL: player
- id - player - clan - rasse -
- 1 - kev - 1 - pirat -
- 2 - plom - 1 - pirat -
- 3 - plom - 2 - pirat -
Jeder Spieler gehört genau einem Clan an,
jedem Clan können mehrere Spieler angehören.
Ein Planet setzt sich zusammen aus planet1 UND planet 2 und planet3.
111:222:333
12:1:7
Deswegen die PLANETENTABELLE mit
der ID für den Datensatz.
dem PLAYER für die Spielerzuordnung
und den 3 einzelnen Planetenteilen.
TBL: planeten
- id - planet1 - planet2 - planet3 - player -
- 1 - 123 - 345 - 678 - 1 -
- 2 - 555 - 111 - 888 - 1 -
- 3 - 999 - 777 - 120 - 2 -
Das bedeutet:
Jeder Planet gehört genau einem Spieler an,
Jedem Spieler können mehrere Planeten angehören.
Jeder Planet ist nur durch seine id gekennzeichnet.
Er besitzt noch nicht einmal einen Namen oder eine sonstige
für einen Menschen leicht merkbare Eigenschaft.
Zusätzlich gibt es drei Eigenschaften, die die unsinnigen
Namen planet1 bis planet3 tragen, die diverse Werte enthalten.
Nun möchtest Du alle Planeten haben, die einem bestimmten Clan zugeordnet sind. Diese Aufgabe ist nahezu trivial und erfordert nur einen einfachen INNER JOIN. Informationen über JOINs findest Du in SELFHTML aktuell:
Einführung in Joins
Fortgeschrittene Jointechniken
1. Schritt:
Ermittle alle Spieler die einem bestimmten Clan angehören:
SELECT
player.id AS spieler
FROM player
WHERE clan = <spezielle id des Clans>
2. Schritt:
Ermittle alle zugehörigen Planeten
SELECT -- Gib mir die
p.id AS planet, -- Einzelheiten der Planeten
p.planet1,
p.planet2,
p.planet3
FROM planeten p -- Aliasnamen ersparen Schreibarbeit :-)
INNER JOIN player s
ON p.player = s.id
WHERE s.clan = <spezielle id des Clans> -- die zu den Spielern eines bestimmten
-- Clans gehören
Das funktioniert natürlich nur, wenn meine vorherigen Annahmen in Ordnung
sind. Möchtest Du etwas anderes, dann musst Du das schon genauer beschreiben.
Stimmt meine Beschreibung der Zusammenhänge nicht, dann ist die Struktur
Deiner Datenbank fehlerhaft - oder Du hast die Zusammenhänge falsch beschrieben.
Freundliche Grüße
Vinzenz