Steinmacher
Threadersteller
Dabei seit: 03.03.2011
Ort: Künzelsau
Alter: -
Geschlecht:
|
Verfasst Mo 10.09.2012 18:20
Titel Fortgeschrittener MySQL Select mit Joins |
|
|
Ich tüftle, google und probiere seit Tagen an einer Lösung für eine MySQL Abfrage und stehe wohl total auf dem Schlauch oder habe ein grundlegendes Verständnis-Problem.
Es geht um einen Fragebogen in dem verschiedene User diverse Fragen in zufälliger Reihenfolge beantworten sollen. Der Fragebogen soll wiederholbar sein, kann also je User mehrere Durchläufe haben.
Dazu habe ich folgende (relevante, vereinfachte) Tabellen angelegt:
"questions" enthält zahlreiche Fragen:
Code: | CREATE TABLE questions (
id INT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
question VARCHAR(100)
); |
"answers" zum speichern der Antworten:
Code: | CREATE TABLE answers (
id INT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
answer VARCHAR(100),
run_id INT(8),
question_id INT(8)
); |
"runs" speichert die Fragebogen-Durchläufe/Beantwortungen:
Code: | CREATE TABLE runs (
id INT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
user INT(8)
); |
Es sollen nun pro Seite/Formular sagen wir 10 Fragen zufällig angezeigt werden. Soweit kein Problem:
Code: | mysql_query("SELECT id, question FROM questions ORDER BY RAND() LIMIT 10"); |
Natürlich sollen ja aber nur die Fragen angezeigt werden, die noch nicht beantwortet wurden. Bei einem Durchlauf bzw. einem User auch noch kein Problem:
Code: | mysql_query("SELECT q.id, q.question FROM questions q LEFT JOIN answers a ON a.question_id=q.id WHERE a.answer IS NULL ORDER BY RAND() LIMIT 10"); |
Mein Problem liegt in folgender Abfrage:
"Zeige mir zufällig 10 Fragen (questions), die noch nicht mit einer bestimmten 'run_id' (z.B. runs.id=7) (in answers) beantwortet wurden."
Ich habe alle möglichen Joins in Betracht gezogen, komme aber auf keinen grünen Zweig. Die einzige unschöne Lösung die mir einfällt: Zu Beginn eines Durchlaufs werden alle Fragen (questions.id) mit answer=NULL und entsprechendem Durchlauf (runs.id) in die answers-Tabelle einzutragen, um sie anschließend mit Antworten zu updaten. Da eventuell jedoch auch während der Beantwortung Fragen hinzugefügt, gelöscht oder geändert werden könnten gefällt mir dieser Weg gar nicht. Würde mich sehr freuen, wenn mir jemand helfen kann.
|
|