Intelligente MySQL Abfrage

Sancheck

Legendäres Mitglied
Hallo,
ich habe eine Tabelle mit folgenden Spalten:

id
Frage
FalscheAntwort1
FalscheAntwort2
FalscheAntwort3
RichtigeAntwort

Nun moechte ich mittels PHP ausgeben:
Frage,FalscheAntwort1,RichtigeAntwort,FalscheAntwort2,FalscheAntwort3,2
und manchmal
Frage RichtigeAntwort,FalscheAntwort2,FalscheAntwort1,FalscheAntwort3,1

und so weiter,...
wobei 2 bzw 1 fuer den Index steht an welchem die richtige spalte steht

Dies soll jedes Mal zufaellig geschehen.

Wer hat hier eine gute Idee?

lg
 
oops geschrieben wird das ganze mittels php.....moeglichst kurz

und 10 zeilen sollen beispielsweise ausgegeben werden.
 
Nicht das, was du hören willst, aber:
Wieso denn so kompliziert, wenn es mit einer ordentlichen Datenbankstruktur auch einfacher geht?

Tabelle "fragen" mit den Feldern "id, frage, antwort_id" und Tabelle "antworten" mit den Feldern "id, frage_id, text" und das Ganze mit einem Join auslesen.
 
QUOTE (Heiko R @ Sa 14.11.2009, 20:08)Tabelle "fragen" mit den Feldern "id, frage, antwort_id" und Tabelle "antworten" mit den Feldern "id, frage_id, text" und das Ganze mit einem Join auslesen.

Ich würde in antworten noch die frage_id weglassen (beide richtungen zu machen ist nicht notwendig) und dafür noch einen kenner einführen der die richtige frage makiert ;-)

edit:
Ich meinen natürlich nicht die richtige Frage sondern die richtige Anwort.

nochmal edit:
abgesehen davon müsste er dann "ORDER BY RAND()" benutzen um die Antworten zu mischen, das ist aber so weit ich weiß alles andere als performant.
 
QUOTE (chricke @ Sa 14.11.2009, 20:54)abgesehen davon müsste er dann "ORDER BY RAND()" benutzen um die Antworten zu mischen, das ist aber so weit ich weiß alles andere als performant.

Ich bin zwar kein mySql-Nutzer.

Aber wenn das nur eine Frage ist (also ein entsprechender Filter auf der Antworten-Tabelle), dann sind das ja nur vier Zeilen, da sollte Rand() unproblematisch sein.
 
QUOTE (chricke @ Sa 14.11.2009, 20:54) Ich würde in antworten noch die frage_id weglassen (beide richtungen zu machen ist nicht notwendig) und dafür noch einen kenner einführen der die richtige frage makiert ;-)


Ah, du hast meine Aufteilung nicht verstanden ;-)

In der Tabelle "antworten" steht im Feld "frage_id" die ID der dazugehörigen Frage drin.
Du musst ja auslesen können, welche Antworten zu welcher Frage gehören.

Das Feld "antwort_id" in der Tabelle "fragen" enthält die ID der richtigen Antwort.

Würdest du in Tabelle "antworten" noch einen "Kenner" einführen, der die richtige Antwort markiert, sorgst du nur für unnötigen overflow, in dem du auch bei jeder falschen Antwort diesen Kenner hast, und wenn es nur eine "0" für "falsch" ist ;-)
Und das "order by rand()" sollte bei 3 oder 4 Antwortmöglichkeiten wirklich nicht viel ausmachen.
Ansonsten lassen sich die Antworten auch in PHP in ein Array schreiben und mischen.
Als KEY für das Array nimmt dann beispielsweise die ID aus der Tabelle "antwort" und vergleicht dann auf der Lösungsseite einfach mit dem Wert "antwort_id" aus der Tabelle "fragen". :)
 
QUOTE (Heiko R @ Sa 14.11.2009, 23:02) Ah, du hast meine Aufteilung nicht verstanden ;-)

In der Tabelle "antworten" steht im Feld "frage_id" die ID der dazugehörigen Frage drin.
Du musst ja auslesen können, welche Antworten zu welcher Frage gehören.

Das Feld "antwort_id" in der Tabelle "fragen" enthält die ID der richtigen Antwort.

stimmt, das hatte ich falsch verstanden ;-)

Was die Performance von dem Rand() angeht weiß ich nur das bei Nutzung des Django-Frameworks explizit darauf hingewiesen wird Abfragen zu vermeiden die im Hintergrund diese Methode benutzen - es ist zwar pro Frage nur ein Satz von 4 Antworten, aber wenn ich den ersten Post richtig verstanden habe will er ja eine Anzahl von Fragen frei übergeben können. Wenn man sein Beispiel nimmt mit den 10 Fragen dann sind es schon 40 Antworten - wenn er das Quiz dann noch länger macht wird es irgendwann unschön.

Edit:
Ich glaube das Tag war schon zu lang für mich - stehe grad auf der Leitung... klar - es sind immer nur 4 Anworten pro Frage, damit bleibt der Aufwand pro Frage immer gleich egal wieviel Fragen er sich vornimmt...
 
Zurück
Oben