mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 29.03.2024 14:34 Benutzername: Passwort: Auto-Login

Thema: Fortgeschrittener MySQL Select mit Joins vom 10.09.2012


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Fortgeschrittener MySQL Select mit Joins
Autor Nachricht
Steinmacher
Threadersteller

Dabei seit: 03.03.2011
Ort: Künzelsau
Alter: -
Geschlecht: Männlich
Verfasst Mo 10.09.2012 18:20
Titel

Fortgeschrittener MySQL Select mit Joins

Antworten mit Zitat Zum Seitenanfang

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. Menno!

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.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Steinmacher
Threadersteller

Dabei seit: 03.03.2011
Ort: Künzelsau
Alter: -
Geschlecht: Männlich
Verfasst Di 11.09.2012 12:20
Titel

Antworten mit Zitat Zum Seitenanfang

Hab es jetzt wie folgt gelöst:

Code:
mysql_query("SELECT q.id, q.question FROM questions q WHERE NOT EXISTS (SELECT * FROM answers a WHERE a.run_id=7 AND a.question_id=q.id) ORDER BY RAND() LIMIT 10");


Gehts das nicht auch mit Joins? Select im Select soll zum einen nicht so gut für den MySQL Optimizer sein und hat wohl eine längere Laufzeit. Oder täusche ich mich da?
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
 
Ähnliche Themen [MySQL] SELECT WHERE
[PHP-MySQL] IF in SELECT, Tabellen Auswahl
[PHP] Benutzerdefinierte Funktionen und MySQL "Select"
Joins - Implizit vs Explizit
select-box option aktiviert select-box
[PHP + mySQL] Kann Fehler in einer mySQL-Phrase nicht finden
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.