mysql abfrage clever gestalten
tom kreuzfahrt
- datenbank
moin, noch eine kleinigkeit und dann hab ich es auch soweit:
ich habe eine mysql tabelle "questions" mit:
id, token, field, question, answer1, answer2, answer3, answer4, correct
für eine multiple choice frage mit 4 antwortmöglichkeiten und der richtigen antwort.
wenn die frage jetzt einmal angezeigt wurde, wird sie in der tabelle "oldquestions" mit:
id, user, token, field, question, answer, result, time
abgelegt, wobei result 0 für falsch und 1 für richtig steht. unter user ist in jedem fall der abgelegt, der die frage bekommen hat.
richtige antworten gehen zusätzlich noch in die tablle "oldquestionscorrect", der aber genauso aufgebaut ist wie schon oldquestions.
sinn und zweck ist, dass ich zum einen 3 zufällige fragen mit:
"SELECT * FROM questions ORDER BY RAND() LIMIT 3"
aber auch nur 3 zufällige fragen ziehen kann, die bislang zwar schon angezeigt worden sind, aber eben nicht richtig beanwortet worden sind.
mein versuch hier war:
select DISTINCT questions.token, questions.question, questions.answer1, questions.answer2, questions.answer3, questions.answer4 from questions
LEFT JOIN oldquestions
ON questions.token=oldquestions.token WHERE ((oldquestions.user NOT LIKE "username")) ORDER BY RAND() LIMIT 3;
führt aber dazu, dass gar nichts kommt.
dann brauch ich auch noch 3 zufällige fragen, die bislang noch gar nicht gezeigt worden sind.
dies ist bestimmt leichter, wenn die abfrage darüber klappt.
wer da was weiß, immer her mit den infos.
danke und gruß,
tom
Hi,
richtige antworten gehen zusätzlich noch in die tablle "oldquestionscorrect", der aber genauso aufgebaut ist wie schon oldquestions.
entferne diese Tabelle. Füge der bestehenden Tabelle eine Spalte zu, in der die Information "richtige Antwort" als Flag hinterlegt wird. Verwende diese Spalte in Deiner WHERE-Klausel.
Cheatah
Hi,
hey
entferne diese Tabelle. Füge der bestehenden Tabelle eine Spalte zu, in der die Information "richtige Antwort" als Flag hinterlegt wird. Verwende diese Spalte in Deiner WHERE-Klausel.
die bestehende ist in diesem fall die "oldquestions"? die hat ja unter result 0 für falsch und 1 für richtig. nur weiß ich nicht, wie ich die where klausel gestalten muss, denn theoretisch kann eine frage ja 2 mal vorhanden sein, einmal falsch und einmal richtig beantwortet, aber zu 2 verschiedenen zeiten. trotzdem will ich bei "keine fragen, die schon mal richtig beantwortet worden sind" keine fragen, die zuvor richtig beantwortet worden sind. unerheblich, ob das erst beim 2. mal oder auf anhieb war. klingt jetzt kompliziert, aber ist vielleicht verständlich. kurzum, ich komm nicht weiter.
ein verzweifelter gruß,
tom
so weit so gut, habe jetzt mit
select DISTINCT questions.token, questions.question, questions.answer1, questions.answer2, questions.answer3, questions.answer4, oldquestions.user from questions left join oldquestions using(token) where ((oldquestions.token is null))
die sache so weit eingeschränkt, dass ich nur fragen bekomme, die eben nicht in der oldquestions tabelle eingetragen sind. hat aber noch den nachteil, dass dort fragen für verschiedene benutzer unter "user" eingetragen werden. nun müsste man also nicht generell die ausschließen, die dort eingetragen sind, sondern nur die einträge, die auch den gleichen nutzernamen haben.
wenn ich nun aber
select DISTINCT questions.token, questions.question, questions.answer1, questions.answer2, questions.answer3, questions.answer4, oldquestions.user from questions left join oldquestions using(token) where ((oldquestions.token is null) && oldquestions.username NOT LIKE "$username")
hinzufüge, ende ich mit null einträgen im ergebnis.
kann mir da wer einen denkanstoß geben?