komplizierte Join Abfrage Problem

bennemann8

Benutzer
Beiträge
6
Hallo zusammen,
ich habe ein kleines bis größeres Problem. Und zwar bekomme ich mit meiner Query nicht immer die passenden Informationen!

Meine Query sieht wie folgt aus:
SELECT t.name, p.name, p.team_id, p.id, value
FROM players p
INNER JOIN round_division r ON r.player_id = p.id
INNER JOIN points ON points.player_id = p.id
INNER JOIN teams t ON t.id = p.team_id
WHERE
type='points1' AND
desk_id = {HIER WIRD MEINE DESK_ID PER SCHLEIFE ÜBERGEBEN} AND
round=1;


Allerdings muss ich da nun noch irgendwie meine TurnierID unterbringen. Ich habe in einer Tabelle "tournaments" eine Spalte "id". Diese ID wird von meinem Programm benutzt und mit Hilfe dieser muss ich die passenden Datensätze auslesen.
Ein Problem was ich dabei habe ist, dass ich zu den Ausgaben, die ich jetzt bekomme (so wie die Query jetzt ist), zusätzlich auch alle Datensätze benötige, die mit der tournaments.id übereinstimmen, aber nicht zwingend in der Tabelle points vorhanden sein müssen.

Es kann sein, dass die Punkte noch nicht eingetragen wurden, oder einfach noch keine Runden erstellt wurden.

Beispiel:
Ich habe zwei Turniere in meiner DB, mit den ids 1 und 2.
Runden wurden in beiden Turnieren bereits generiert, allerdings wurden nur Punkte für das Turnier mit der ID = 1 eingetragen. Somit gibt es in der Tabelle points keinen einzigen Datensatz, in der in der Spalte tournament_id = 2 steht.
Nun benötige ich alle Daten, die ich selecten möchte trotzdem (logischerweise bis auf 'value').
Wenn ich allerdings das Turnier mit der ID = 1 laden würde, dann sollen zusätzlich auch die Punkte selected werden.

Anbei habe ich meine DB Struktur mal als Bild angefügt.
Ich hoffe ihr versteht was ich meine bzw. was mein Problem ist.
Das Ganze muss performance optimiert sein, ich muss also irgendwie versuchen, wenige queries zu verarbeiten, da alles über eine Online DB passiert. Das Programm greift nicht auf eine lokale DB zu.

Gruß
Jakob
 

Anhänge

  • Bildschirmfoto 2016-09-20 um 14.14.00.png
    Bildschirmfoto 2016-09-20 um 14.14.00.png
    379,5 KB · Aufrufe: 2
Werbung:
Ok, ich glaube ich habs hinbekommen :)
folgendes liefert mir, zumindest bei den ersten Tests das jeweils richtige Ergebnis:
SELECT t.name, p.name, p.team_id, p.id, value
FROM players p
INNER JOIN round_division r ON r.player_id = p.id
LEFT JOIN points ON points.player_id = p.id
INNER JOIN teams t ON t.id = p.team_id
WHERE
type='points1' AND
desk_id = {MEINE TISCHNUMMER} AND
round=1 AND t.tournament_id = {MEINE TURNIER-ID}
OR
type IS NULL AND
desk_id ={MEINE TISCHNUMMER} AND
round = 1 AND
t.tournament_id = {MEINE TURNIER-ID} ;

Ich weiß zwar noch nicht so genau wieso das IS NULL in Verbindung mit dem Left Join so viel bewirkt, aber nunja..
 
Also ich kann dir nur mit Mühe folgen und habe mich jetzt nicht ausgibig damit befasst aber dein Eingangsproblem
zusätzlich auch alle Datensätze benötige, die mit der tournaments.id übereinstimmen, aber nicht zwingend in der Tabelle points vorhanden sein müssen.
löst man natürlich mit LEFT JOIN statt mit INNER JOIN, wie offensichtlich geschehen.

Dein finales Statement ließe sich noch durch Klammern etwas kürzen:
Code:
SELECT t.name, p.name, p.team_id, p.id, value
FROM players p
INNER JOIN round_division r ON r.player_id = p.id
LEFT JOIN points ON points.player_id = p.id
INNER JOIN teams t ON t.id = p.team_id
WHERE
( type='points1' OR type IS NULL ) AND
desk_id = {MEINE TISCHNUMMER} AND
round=1 AND t.tournament_id = {MEINE TURNIER-ID};
Außerdem würde ich dir dringend emfehlen alle Spalten eindeutig zu benennen, also mit Tabellenname.Spalte oder Tabellenalias.Spalte (Aliase verwendest du ja schon teilweise). Die Spalte type z.B. gibt es bei dir in mehreren Tabellen und eine eindeutige Verwendung wird auch dein Verständnis verbessern. Man muss ja seinen eigenen Code auch noch lesen können...
 
Werbung:
Danke ukulele!
Ich glaube ich, da sollte ich mir die verschiedenen Joins nochmal etwas genauer ansehen. Irgendwie finde ich die immer noch etwas "komisch" :)
Aber mit der eindeutigen Benennung der Spalten hast du natürlich völlig recht, wurde auch schon geändert.
 
Zurück
Oben