Linke Verbindung der gleichen Tabelle mehrmals

8

Angenommen, ich habe ein Spiel, das von 2, 3 oder 4 Spielern gespielt werden kann. Ich verfolge ein solches Spiel in meiner Datenbank (MySQL 5.1) in drei Tabellen. Ich hoffe, dass die Felder selbsterklärend sind:

%Vor%

[Die zwei Zeiten, die in der Spieltabelle verfolgt werden, sind die Start- und Endzeit]

Hier sind einige Dummy-Daten zum Auffüllen der Tabellen:

%Vor%

Jetzt muss ich einen Bericht im folgenden Format erstellen:

%Vor%

Das ist ein Bericht, der alle Spieler zeigt, die ein Spiel in derselben Reihe gespielt haben. Ich brauche auch ihre Ergebnisse und einige andere Informationen aus der Tabelle users, aber das ist Phase 2.: -)

Ich habe damit angefangen:

%Vor%

Dies gibt mir alle Spiele, in denen alle vier Plätze besetzt waren (dh nur Spiel ID 3 in den obigen Dummy-Daten). Aber das ist nur eine Teilmenge der Daten, die ich brauche.

Dies ist mein zweiter Versuch:

%Vor%

Dies ergibt 14 Zeilen mit den obigen Dummy-Daten. Ich habe versucht, eine Fehlerquelle zu beseitigen, indem ich ug1 an den Eintrag für den niedrigsten UID-Player anbinde:

%Vor%

Jetzt bin ich in 9 Zeilen, aber ich habe immer noch viele falsche Daten. Ich kann das Problem sehen - dass zum Beispiel in Spiel 3, mit ug1 bei Benutzer 102 verankert, noch drei Spieler sind, an denen ug2 verankert werden kann. Und so weiter. Aber ich kann keinen Weg finden, dieses Rätsel zu lösen - wie kann ich letztendlich eine Abfrage erreichen, die 4 Reihen mit den Spielern in der richtigen Reihenfolge und Nummer ausgibt?

Dies scheint mir ein gelöstes Problem in anderen Kontexten zu sein. Ich schätze alle Hilfe hier.

    
ObiObi 19.12.2011, 16:41
quelle

3 Antworten

16

Ein Problem, das Sie haben, ist, dass Sie keine Felder haben, die einen Benutzer als Spieler 1, 2, 3 oder 4 beschreiben. Sie müssen jedoch sicherstellen, dass pro LINKEN VERBINDUNG nur ein Spieler verbunden ist.

Wenn du ein Feld "player_id" zu users_games hinzufügst, wird es trivial ...

%Vor%

There sind Alternativen, die alle LEFT JOINs vermeiden, aber dieses Beispiel dient auch als Grundlage für den nächsten Schritt ...)


Wenn Sie dieses Feld nicht hinzufügen können, wird es komplexer. (SQL Server, Oracle usw. können dieses player_id-Feld mit ROW_NUMBER () proxysen, MySQL kann das nicht.)

Stattdessen benötigen Sie korrelierte Unterabfragen, um den "nächsten Spieler" zu identifizieren.

%Vor%


BEARBEITEN JOIN kostenlose Version, vorausgesetzt, dass player_id Feld vorhanden ist ...

%Vor%     
MatBailie 19.12.2011, 16:54
quelle
4
%Vor%

natürlich 9999999 sollte die maximal mögliche Benutzer-ID -1 sein. Dies handelt die Unterabfragen der vorherigen Antwort gegen eine große Gruppierungsabfrage.

Getestet auf MySQL 5.1 Ubuntu Lucid mit Ihren Testdaten.

    
Eugen Rieck 19.12.2011 16:59
quelle
0

Wäre es nicht einfacher, nur ...

%Vor%

Und wenn Sie Scores wollen, fügen Sie einfach eine Funktion hinzu und dann ...

%Vor%     
symcbean 19.12.2011 17:14
quelle

Tags und Links