SQL JOIN über zwei Tabellen

CheeseCakeMen

Cadet 3rd Year
Registriert
Feb. 2021
Beiträge
42
Nabend zusammen,

habe zwei Tabellen:
1. Questions: mit den Spalten question_id, game_id, question, answer
2. Bonusfragen: bonus_id, question_id, game_id, variable, value


SQL:
SELECT q.question, q.answer , b.variable, b.value
FROM questions AS q
LEFT JOIN bonusfragen AS b
ON q.question_id = b.question_id AND  q.game_id = ?

Nun möchte ich alle Fragen zu einem bestimmtem Spiel abrufen und zusätzlich noch die Bonusfragen wenn eine vorhanden ist. Bei manchen Fragen gibt es keine Bonusfragen.

Kann mir bitte jemand auf die Sprünge helfen
 
Ich mag mich vielleicht irren, aber es reicht hier doch eigentlich ein Inner Join , ohne die zusätzliche Bedingung "And q.game_id=?"

Dann müsstest du alle Infos haben.
 
CheeseCakeMen schrieb:
Nun möchte ich alle Fragen zu einem bestimmtem Spiel abrufen und zusätzlich noch die Bonusfragen wenn eine vorhanden ist. Bei manchen Fragen gibt es keine Bonusfragen.
Der letzte Satz verwirrt mich. Gehört eine Bonusfrage zu einer konkreten anderen Frage?
Aus deinen Tabellen hätte ich jetzt geschlussfolgert, dass es eine Reihe von Fragen ohne Verknüpfung zu Bonusfragen sind -> normale Frage.
Und dann Fragen, zu denen ein Eintrag in Bonusfragen existiert -> Bonusfrage.
Ohne Abhängigkeit der beiden Fragenmengen voneinander.

Der letzte Satz klingt jetzt aber, als sollte eine Bonusfrage einer normalen Frage zugeordnet sein? Wie soll das funktionieren? Du hast ja nur einen Fremdschlüssel zu einer Frage. Du bräuchtest dann aber zwei: Einmal die "normale", zu der sie gehört, und dann zu einer weiteren, die den Inhalt (question + answer) der Bonusfrage enthält. Zudem ergäbe dann keinen Sinn, game_id in Bonusfrage zu haben, wenn sie eh von einer normalen abhängt.

Falls ich das falsch verstanden habe und die Fragen unabhängig voneinander sind, wäre hier wohl ein UNION, was du willst.
SQL:
SELECT q.question, q.answer , NULL as variable, NULL as value
FROM questions AS q
WHERE q.game_id = ?
UNION
SELECT q.question, q.answer , b.variable, b.value
FROM questions AS q
JOIN bonusfragen AS b ON q.question_id = b.question_id
WHERE b.game_id = ?
 
sql_joins.png

Meiner Meinung nach ist ein LEFT JOIN richtig. Er braucht ja auch die Fragen wo es keine Bonusfragen gibt.

Aber zusätzlich denke ich ein UNION wie Enurian schon schrieb.

Ich gehe mal davon aus, dass variable and value auch für Frage und Antwort stehen und in die selbe Ausgabemenge wie die normalen Fragen und Antworten sollen.

Dann sähe es so aus:

SQL:
SELECT q.question, q.answer
FROM questions AS q
WHERE q.game_id = ?
UNION
SELECT b.variable AS question, b.value AS answer
FROM questions AS q
LEFT JOIN bonusfragen AS b 
ON q.question_id = b.question_id
AND b.game_id = ?;

sel.png

Habs mal kurz getestet und die Ausgabe mit dran gehangen.

Ansonsten müsste der TE seine Frage noch mal genauer spezifizieren, wenn es nicht so gedacht ist.
Aber man kann das auch sicher etwas besser machen.
 
Bevor da eine Antwort möglich ist, bitte eine kurze Erläuterung wie die Daten zu interpretieren sind.

Mir sieht das grad wie ein XY Problem aus: das Schema scheint suboptimal zu sein für den Bedarf.
Aber das mag täuschen.
 
  • Gefällt mir
Reaktionen: Murray B. und Ice-Lord
Zurück
Oben