Wie schreibe ich SQL unten, um alle Details anzuzeigen

8

Ich weiß nicht, ob ich die folgende Methode richtig mache, wenn ich sql benutze, aber hier geht es.

Ich möchte alle Prüfungsdetails (Prüfungsdetails (auch bekannt als Sitzung), Prüfungsfragen, Antworten, Strafe, Bilder, Videos usw.) anzeigen. Aber die Art, wie ich es versuche, ist eine große Frage, ist es aber nicht Arbeiten, da keine Zeilen angezeigt werden.

Im Folgenden möchte ich eine Prüfung (und nur eine Prüfung) anzeigen:

  • Prüfungsdetails
  • Alle Fragen in der Prüfung
  • Alle Antworten zu jeder Frage und markiert jede Antwort wert
  • Strafe (wenn aktiviert oder nicht)
  • Strafzettel für falsche Antworten
  • Bilder in Frage
  • Videos in Fragen
  • Audio in Fragen
  • Moduldetails
  • Schüler

Unten sehen Sie die Felder, die jeder Abschnitt von der Datenbank benötigt:

  • Prüfungsdetails

    SessionId, SessionName, SessionDuration, TotalMarks, SessionWeight

  • Alle Fragen in der Prüfung

    QuestionId, QuestionNo, QuestionContent, NoofAnswers, QuestionMarks, OptionId, OptionType, ReplyId, ReplyType

  • Alle Antworten zu jeder Frage und markiert jede Antwort wert

AnswerId, Answer, AnswerMarks

  • Strafe (wenn aktiviert oder nicht)

PenaltyEnabled

  • Strafantworten

PenaltyAnswerId, PenaltyAnswer, PenaltyMarks

  • Bilder in Frage

ImageId, ImageFile

  • Videos in Fragen

VideoId VideoFile

  • Audio in Fragen

AudioId, AudioFile

  • Moduldetails

ModuleId, ModuleNo, ModuleName

  • Schüler

StudentId

Meine Frage ist, wie sollte der SQL-Code geschrieben werden, damit all diese Daten angezeigt werden? Benötige ich nur eine große Abfrage oder viele kleine Abfragen? Mein Versuch ist am Ende der Frage, aber unten sind die Datenbanktabellen, die Details zeigen, die sich auf eine Prüfung und alle seine Details beziehen.

TABELLEN:

Student

%Vor%

Schüler_Sitzung

%Vor%

Sitzung

%Vor%

Modul

%Vor%

Frage

%Vor%

Antwort:

%Vor%

Individuelle Antwort

%Vor%

Strafe

%Vor%

Strafmarkierungen

%Vor%

Antworten

%Vor%

Option_Table

%Vor%

Bild

%Vor%

Video

%Vor%

Audio

%Vor%

Image_Question

%Vor%

Video_Question

%Vor%

Audio_Question

%Vor%

Unten war mein fehlgeschlagener Versuch:

%Vor%

UPDATE:

Kann der folgende Code QuestionId nach Fragen in die Image_Question-Tabelle einfügen: (Dies ist etwas, das ich auf SO gefunden habe, aber auf mein Tabellendesign aktualisiert wurde)

%Vor%

Und die Logik gefällt mir:

  1. Frageformular für Benutzeranfragen. Server setzt Token und schließt als Antwort auf Benutzer ein.
  2. Der Nutzer lädt das Bild einschließlich des Tokens hoch. Das Bild wird in der temporären Tabelle gespeichert.
  3. Schritt 2 wird n-mal wiederholt.
  4. Wenn der Benutzer eine Frage mit Token-Wert einreicht, wird ein Eintrag in die Fragen-Tabelle platziert und eine ID zugewiesen. Alle Bilder in der TempImage-Tabelle, die das Token teilen, werden mit der nun bekannten QuestionId in die Bildtabelle eingefügt. Der ImageQuestionToken-Eintrag wird dann gelöscht und kaskadiert die temporären Images in TempImage.
  5. Der andere Benutzer sendet keine Fragen, dann werden die Dateien gelöscht und der Eintrag ImageQuestionToken gelöscht.
user1723760 30.10.2012, 00:24
quelle

4 Antworten

1

In diesen Tabellen gibt es ein Problem mit Ihren Fremdschlüsseln: Image_Question, Audio_Question und Video_Question.

Sie verwenden die Spalte FrageNr, die nicht durch die Tabelle Frage indiziert ist. Ich würde vorschlagen, stattdessen die Spalten als QuestionId zu ersetzen und ihre Werte zu verwenden.

%Vor%

und Ihre Aussage sollte so aussehen:

%Vor%

Aktualisierung: Sie können die Spalte QuestionNo verwenden, nachdem Sie den Index hinzugefügt haben, so dass Sie Ihre Codes nicht überholen müssen. hehehe

Ich schlage vor, Sie fügen dies hinzu:

%Vor%

und anstelle von diesen:

%Vor%

Sie verwenden diese:

%Vor%     
Joseph Caracuel 16.01.2013, 09:25
quelle
2

Ich bin mir zwar nicht 100% sicher, welches genaue Ergebnis Sie wollen. Basierend auf Ihrer vorhandenen Abfrage besteht das Problem, dass Sie INNER JOIN für einige der Tabellen verwenden, wenn Sie LEFT JOIN verwenden sollten.

In Ihrer vorhandenen Abfrage verwenden Sie Folgendes:

%Vor%

Das Problem besteht darin, dass INNER JOIN nach übereinstimmenden Datensätzen in allen Feldern sucht, aber Sie haben möglicherweise keinen Datensatz in den Tabellen image , audio oder video , so dass nichts zurückgegeben wird.

Basierend auf Ihren Angaben sollte Ihre Anfrage ähnlich wie folgt aussehen:

%Vor%

Siehe SQL Geige mit Demo .

Dies gibt alle Daten zurück, die Sie oben angefordert haben. Beispiel:

%Vor%     
Taryn 16.01.2013 10:59
quelle
0

Das Schlüsselproblem: Häufig werden keine Zeilen zurückgegeben, die einen inneren Join einer äußeren verbundenen Tabelle verwenden

Ich habe unter Verwendung von Microsoft SQL-Syntax unterwandert. Ich hoffe es hilft. Sehen Sie sich meine Warnungen unten an und ignorieren Sie die Anweisung create procedure, wenn Sie möchten, und deklarieren Sie stattdessen einfach die @SessionID auf 1 und setzen Sie sie oben.

%Vor%

Warnungen: Sie möchten dies wirklich auf verschiedene Aspekte reduzieren, um sie in Ihrer Client-Anwendung anzuzeigen. Beispielsweise benötigen Sie eine Master- / Detailanzeige für Exams und ExamDetails, ansonsten müssten Sie in der Ausgabe, die dem Benutzer angezeigt wird, Wiederholungswerte unterdrücken. Zum Beispiel würde Ihre Ausgabe wie folgt aussehen:

%Vor%

Beachten Sie die sich wiederholenden Werte auf der linken Seite, die Sie unterdrücken müssten.

    
Norman Seymore 16.01.2013 03:39
quelle
0

Nun, versuchen Sie es in kleinen Schichten: Was ich meine ist: - Führen Sie die Abfrage Teil für Teil Entfernen Sie zuerst einige Joins (entfernen Sie die meisten), und fügen Sie sie einzeln hinzu, mache ich dasselbe für meine großen Abfragen, um zu verfolgen, wo das eigentliche Problem ist, oder welche Bedingungen die Hauptunterschiede für das Erhalten der resultierenden Zeilen machen. nur eine Idee. Prost!

Und ich denke

%Vor%

gibt Ihnen Nullwerte

Als q.QuestionId startet Form 4 und iq.QuestionNo ist 2

%Vor%

Und alle Werte in Iq-Feldern, die aus linken äußeren Joins resultieren, sind null. Wenn also ein innerer Join auf ihnen steht, ist es sicher, dass Sie null Ergebnisse erhalten.

    
Abhishek Bhandari 16.01.2013 05:37
quelle

Tags und Links