kEv*: query aus 3 Datenbanktabellen

Hallo liebe SELFHTMLer,

kurz die Struktur der 2 Tabellen.

TBL: player
------------------------------

  • id - player - clan - rasse -
    ------------------------------
  • 1  - kev    - 1    - pirat -
    ------------------------------
  • 2  - plom   - 1    - pirat -
    ------------------------------
  • 3  - plom   - 2    - pirat -
    ------------------------------

TBL: clan
-------------

  • id - clan -
    -------------
  • 1  - clan1-
    -------------
  • 2  - clan2-
    -------------

TBL: planeten
---------------------------------------------

  • id - planet1 - planet2 - planet3 - player -
    ---------------------------------------------
  • 1  - 123     -  345    -  678    -   1    -
    ---------------------------------------------
  • 2  - 555     -  111    -  888    -   1    -
    ---------------------------------------------
  • 3  - 999     -  777    -  120    -   2    -
    ---------------------------------------------

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

--
SELFCODE:
sh:( fo:| ch:? rl:° br:^ ie:{ mo:| va:) de:] zu:) ss:| ls:[ js:|
---
  1. 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

    1. 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.

      1. 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

      2. 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