SQL SQL Abfrage alles in einer oder mehrerer?

HanserFan

Cadet 3rd Year
Registriert
Nov. 2020
Beiträge
38
Folgende Ausgangssituation: Habe zwei Tabellen

Tabelle1: "Namen" mit Spalten
ID, Name, Punktzahl, Fragen

Tabelle2: "Fragen" mit Spalten:
ID, ID_Name

In Tabelle "Fragen" stehen mehrere Fragen zugeordnet zum jeweiligen User drin.

Nun möchte ich gern die jeweiligen Fragen auslesen, welche der einzelne User bisher gestellt hat und oben im Titel den User mit anzeigen. Dafür nutze ich den Code:
Code:
SELECT
*
    FROM
        namen,
        fragen
    WHERE
        namen.id = questions.id_name
    AND
        namen.id = 1 "

Da nun aber ein User mehrere Fragen haben kann, wird dadurch der Name mehrfach abgefragt. Kann ich dies alles in der gleichen Abfrage machen oder sollte ich dies auf zwei einzelne Abfragen ausweiten?
 
Mit einem join :
Code:
SELECT * from fragen
INNER JOIN namen ON fragen.id=namen.id
;
 
Das sind aber absolute SQL Basics. Liest du nebenbei etwas zu SQL oder beschäftigst dich mit Grundlagen?
 
  • Gefällt mir
Reaktionen: GroMag
Ja ich beschäftige mich mit den Grundlagen und da war ich immer der Meinung das meine Schreibweise oben schon eine Join Abfrage ist, allerdings in verkürzter Form. So haben wir das damals zumindest beigebracht bekommen.
 
Richtig, ist es, im ganz alten SQL Standard.

Versuch die Komma Syntax zu vergessen. Sie ist abgekündigt und insbesondere fehlerträchtig.


Was die ursprüngliche Frage angeht: du läßt die Anwendungen eine Liste der IDs der gestellten Fragen halten und schließt diese per NOT IN() aus. Das erfordert NOT NULL auf der abgefragten Spalte, aber das ist wegen inner join bereits ausgeschlossen.
 
Aber auch mit dem Inner Join bekomme ich nun den Namen mehrfach ausgegeben
 
Wieso ist Name identisch Frage? Verstehe ich irgendwie nicht. Da fehlt was, vermutlich eine Assoziation (Name;Frage) mit oder ohne zusätzliche Antworten.
 
Du musst vermutlich auch auf Namen.ID = Fragen.NAME_ID joinen, wenn das der Fremdschlüssel sein soll. (In dem Ratschlag ist der Join auf Name.ID = Fragen.ID)
Es ist übrigens evtl. ratsam beide Spalten NAME_ID zu nennen, dann kommt man auch nicht durcheinander was was sein soll.
 
Danke für Eure Hilfe, hatte beim Auslesen ein Fehler in der Schreibweise der Tabellen. Vermutete allerdings einen Fehler woanders und kam so nicht darauf.
@KingLz
Habe Deinen Vorschlag angenommen und die Spalten umbenannt.
 
HanserFan schrieb:
Da nun aber ein User mehrere Fragen haben kann, wird dadurch der Name mehrfach abgefragt. Kann ich dies alles in der gleichen Abfrage machen oder sollte ich dies auf zwei einzelne Abfragen ausweiten?
Bei einem Join vermehrst du den Inhallt der einen Seite des Joins, deren verknüpftes Vorkommen öffter in der anderen Seite aufzufinden ist.
Das geht in Richtung beider Seiten, wenn du eine n-m-Verbindung hast.

Ins Extreme geführt, bekommst du bei einem Full Outer Join, ohne jegliche Restriktionen, gar quasi das Matrizenprodukt aller Quellen, in dem dann in der Ergebnismenge jeder Eintrag n bzw. m Mal vorkommt. (Die Ergebnismenge fasst dann folglich n x m Datensätze.)

Um zurück zu deiner Frage zu kommen:
Das kannst du schon machen.
Schön ist es aber nicht unbedingt.
Idealer Weise hast du irgendwo schon mal die Infos zu dem User "herumliegen", sodass du eigentlich nur noch mit der User-ID in deine Fragen-Tabelle, ohne Join, gehen musst, um alle Fragen für diesen User zu bekommen.

Ich hoffe, das beantwortet deine Frage ausreichend.
Wenn nicht, musst du evtl. die Frage noch etwas weiter spezifizieren oder mehr Informationen über die Rahmenbedingungen geben.
 
Habe ich das richtig verstanden, ich sollte dann lieber eine Abfrage machen welche den Username (und später vlt. noch andere Daten abfragt) und eine andere Abfrage um die Spiele des Users abzufragen?
 
Das hängt ganz davon ab. Normalerweise solltest du dir um solche Optimierungen erst Gedanken machen, wenn es wirklich zu einem Problem wird. Wenn du weißt, dass es in naher Zukunft nicht mehr als 1.000.000 Fragen (Zahl variiert, dient nur als Beispiel) geben wird, dann kannst du auch jedes mal die Benutzerdaten mit abfragen.
Für die Performance wird es irgendwann ab einer Anzahl von Fragen schneller sein, einmal die Benutzerdaten und danach die Fragen abzufragen.
Wenn du später mal komplexe Abfragen hast, dann kann es schon wieder deutlich langsamer sein x mal die Datenbank einzeln abzufragen als es in einem Rutsch abzufragen (Netzwerk, Übertragungsrate, etc.). Da das ganze dann immer recht kompliziert und langwierig wird, sollte man erst optimieren wenn es auch wirklich notwendig ist.
 
Performancefragen blendet man m.E. bei den Grundlagen erst Mal komplett aus. Es reicht vollkommen, wenn man die Theorie befolgt und idealerweise nach BNF die Tabellen entwirft. Viel später dann kommt hoffentlich auch das Verstehen dazu.
 
Zurück
Oben