SQL Abrrage ?
elbarto
- datenbank
Hallo,
ich hoffe ihr könnt mir helfen.
Ich habe eine Datenbank mit 4 Tabellen.
tournament_battles (opponentID, challengerID, ....) = Begegnungstabelle
tournaments (tournamentID, ...) = Turniertabelle
user_to_tournaments (tournamentID, userID) = Turnierteilnehmerrelationstabelle
users(userID, username, ....) = Benutzertabelle
Die wichtigen Felder habe ich mal mit eingetragen.
Es soll folgendes Ergebnis erzielt werden:
Es sollen alle Teilnehmer mit allen tournament_battles Feldern, user_to_tournaments userID Feld und users username Feld aufgelistet werden, die im tourmanent_battles challengerID oder opponentID gespeichert sind, die am Turnier user_to_tournaments tournamentID X teilnehmen. Wenn es keine Begegnungen gibt, sollen trotzdem die Teilnehmer aufgelistet werden und die tournament_battle Felder geNULLed werden.
Kann mir da einer helfen ?
yo,
Kann mir da einer helfen ?
wie ist den die tabelle tournament_battles mit der tabelle tournaments verbunden, dazu gibt es doch bestimmt auch eine entsprechende spalte in der tournament_battles tabelle oder ?
Ilja
yo,
Kann mir da einer helfen ?
wie ist den die tabelle tournament_battles mit der tabelle tournaments verbunden, dazu gibt es doch bestimmt auch eine entsprechende spalte in der tournament_battles tabelle oder ?
Ilja
tournamentID sind in allen 3 Tabellen (tournaments, tournament_battles und user_to_tournaments) vorhanden.
SELECT
battle.*, tu.userID, user.username
FROM user_to_tournaments tu
LEFT JOIN users user ON (user.userID = tu.userID)
LEFT JOIN tournament_battles battle
ON (battle.opponentID = tu.userID OR battle.challengerID = tu.userID)
WHERE tu.tournamentID = 1
Komischer Weise funktioniert dieses Query in phpMyAdmin und zeigt mir auch die gewünschte Ergebnisse
opponentID opponentName challengerID challengerName userID userName
1 admin 2 test 1 admin
1 admin 2 test 2 test
2 test 1 admin 1 admin
2 test 1 admin 2 test
0 3 test2 3 test3
3 test3 0 3 test3
die Teilnehmer, die gegen opponentID/challengerID = 0 antreten, haben ein freilos bzw sind automatisch weiter.
Wenn ich den Query allerdings bei mir durchjage, gibt er mir die ersten 5 Zeilen aus und in der letzten Ergebnisreihe sind alle battle.* Daten genulled, obwohl sie mir ja im phpMyAdmin mit dem gleichen Query angezeigt werden ?
Woran kann das liegen ?
yo,
SELECT
battle.*, tu.userID, user.username
FROM user_to_tournaments tu
LEFT JOIN users user ON (user.userID = tu.userID)
LEFT JOIN tournament_battles battle
ON (battle.opponentID = tu.userID OR battle.challengerID = tu.userID)
WHERE tu.tournamentID = 1
der erste LEFT JOIN ist schon mal überflüssig, du kannst zwischen users und users\_to\_tournaments, bzw. tournaments einen INNER JOIN machen, schließlicnh willst du ja nur die user haben, die am einem bestimmten tournament teilnehmen haben. die tabelle tounraments kannm an natürlich auch weglassen, falls man wirklich keine spalten von der tabelle anzeigen will (in dem fall musst du die abfrage anpassen). auch würde ich von den users losgehen und die tabelle tournament\_battles mit einem OUTER JOIN einbinden, ließt sich einfach logischer, also:
SELECT ...
FROM users u
INNER JOIN user\_to\_tournaments ut ON bedingung
INNER JOIN tournaments t ON bedingung
INNER JOIN tournament\_battles tb ON bedingung
WHERE ut.tournamentID = 1
;
des weieren fehlt mir in der JOIN bedingung der tabelle tournament\_battles die verbindung zu den tournaments. es reicht nicht, sie nur mit der user tabelle zu verbinden, sprich:
ON (tb.opponentID = u.userID OR tb.challengerID = tu.userID) AND tb.tournamentID = t.tournamentID
Ilja
yo,
SELECT ...
FROM users u
INNER JOIN user_to_tournaments ut ON bedingung
INNER JOIN tournaments t ON bedingung
INNER JOIN tournament_battles tb ON bedingung
WHERE ut.tournamentID = 1
;
lach, vom OUTER JOIN gesprochen, und INNER JOIN geschrieben, muss natürlich heißen:
LEFT JOIN tournament_battles tb ON (tb.opponentID = u.userID OR tb.challengerID = tu.userID) AND tb.tournamentID = t.tournamentID
Ilja