Ankündigung

Einklappen
Keine Ankündigung bisher.

Formulierung eines Aufwändigen Querys

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Formulierung eines Aufwändigen Querys

    Guten Tag,

    ich hätte ein Anliegen bezüglich eines Datenbank-Problems.

    Ich schreibe ein PHP-Tool, welches einen Multiple-Choice-Test zur Verfügung stellt. Zu diesem Zweck gibt es Fragen mit ein paar Antwortmöglichkeiten. Von diesen können 0,1,2, .... oder alle richtig sein.


    Datenbank-Schema (stark vereinfacht):

    questions (qid, text, points)
    answers (aid, questionid, text)
    giveanswers (gid, answerid)
    correctanswers (cid, answerid)
    Jetzt gibt es beispielsweise 10 Fragen mit je unterschiedlich vielen Punkten. Zu jeder Frage gibt es Antwortmöglichkeiten in answers, die richtig sein können (entsprechender Eintrag in correctanswers). Welche Antwort(en) vom Benutzer gegeben wurden steht in givenanswers.

    Mein Problem ist jetzt die Auswertung. Ich möchte die erreichten Punkte errechnen.

    Ich hätte folgenden Vorschlag:

    Ich probiers mal algorithmisch zu formulieren: Iteriere über alle Fragen und überprüfe bei jeder Antwortmöglichkeit, dass falls sie in correctanswers vorhanden ist, auch in givenanswers sein müsste. Falls sie nicht in correctanswers ist, dann darf sie auch nicht in givenanswers sein. Wenn das erfüllt ist, dann gibt es soviele Punkte, wie für die Frage vorgesehen, ansonsten 0 Punkte. Gebe die Summe der gegebenen Punkte aus.


    Ich hab mir zuerst überlegt, ob ich die Datenbank abrufen sollte und das mit den PHP-Arrays ausprogrammieren sollte, aber ich glaube es ist sinnvoller hier einen query zu verwenden.

    Vielen Dank schon im Voraus

  • #2
    Zitat von jw202 Beitrag anzeigen
    Guten Tag,

    Ich hätte folgenden Vorschlag:

    Ich probiers mal algorithmisch zu formulieren: Iteriere über alle Fragen und überprüfe bei jeder Antwortmöglichkeit, dass falls sie in correctanswers vorhanden ist, auch in givenanswers sein müsste. Falls sie nicht in correctanswers ist, dann darf sie auch nicht in givenanswers sein. Wenn das erfüllt ist, dann gibt es soviele Punkte, wie für die Frage vorgesehen, ansonsten 0 Punkte. Gebe die Summe der gegebenen Punkte aus.
    Klingt nach INTERSECT: http://www.postgresql.org/docs/curre...ies-union.html

    Andreas

    Kommentar


    • #3
      Ich würde es so lösen:

      Tabelle Fragen
      Frage_id | Fragetext

      Tabelle Antworten
      Frage_id | Antwort_id | Antworttext | Punktzahl

      Tabelle Auswertung
      Teilnehmer_id | Antwort_id

      Die Abfrage ist der Ergebnisse ist simpel und schnell möglich.

      Kommentar


      • #4
        Ok, ich habe eine mehr oder weniger unhandliche Möglichkeit gefunden. War zwar einen ganzen Tag Arbeit aber es hat funktioniert.


        Hier gibts den mal für die Nachwelt:

        Code:
        SELECT sum(q.points) FROM question q WHERE q.type = '1'  AND q.qid = '$qid' AND
        
        (SELECT COUNT(*) FROM question q3, answers a3, correctanswers c3 WHERE q3.questionid = q.questionid AND a3.questionid = q3.questionid AND a3.aid = c3.answerid AND q3.type = '1'
        AND a3.aid NOT IN (SELECT a2.aid FROM question q2, answers a2, givenanswers g2 WHERE a2.questionid = q2.questionid AND a2.aid = g2.answerid AND q2.type = '1')) = 0 
        
        
        AND (SELECT COUNT(*) FROM question q2, answers a2, givenanswers g2 WHERE q2.questionid = q.questionid AND a2.questionid = q2.questionid AND a2.aid = g2.answerid AND q2.type = '1'
        AND a2.aid NOT IN (SELECT a3.aid FROM question q3, answers a3, correctanswers c3 WHERE a3.questionid = q3.questionid AND a3.aid = c3.answerid AND q3.type = '1')) = 0

        PS.: Optimierungsvorschläge sind willkommen

        Kommentar


        • #5
          Optimierungsvorschläge sind willkommen
          Mein Beitrag nicht gut ?
          Damit würde sich die Auswertung auf ein simples SELECT reduzieren, oder ist das nicht einfach genug?

          Kommentar

          Lädt...
          X