Thomas Wiedmann http://www.twiedmann.de
• Sie befinden sich hier: Startseite > SQL-Backstube > Quizfragen auswerten

Die SQL-Backstube

Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.

18.07.2010: Quizfragen auswerten

Problemstellung

Umfragen und Quiz mit mehreren Fragen auszuwerten ist manchmal gar nicht so einfach. Im folgenden Beispiel werden eine Reihe von Fragen und deren Antworten geprüft. Nur die Teilnehmer, die alle Fragen richtig beantwortet haben, sollen aufgelistet werden.

Getestet mit folgenden Datenbanken:

* MySQL 5.1.30
* IBM DB2 9.1

Datenbank-Tabellen

Die Datenbank-Tabellen hierfür sehen wie folgt aus:

Listing 1:

  1. /**
  2. * Teilnehmer der Umfrage bzw. des Quiz
  3. */
  4. CREATE TABLE teilnehmer (
  5. t_id INT NOT NULL,
  6. name VARCHAR(100) NOT NULL,
  7. PRIMARY KEY (t_id)
  8. );
  9. /**
  10. * Die Fragen und die richtige Antwort
  11. */
  12. CREATE TABLE fragen (
  13. f_id INT NOT NULL,
  14. frage VARCHAR(200) NOT NULL,
  15. richtig INT NOT NULL,
  16. PRIMARY KEY (f_id)
  17. );
  18. /**
  19. * Die Antworten der Teilnehmer
  20. */
  21. CREATE TABLE teilnehmer_antwort (
  22. ta_id INT NOT NULL,
  23. t_id INT NOT NULL,
  24. f_id INT NOT NULL,
  25. antwort INT NOT NULL,
  26. PRIMARY KEY (ta_id),
  27. CONSTRAINT fk_teilnehmer
  28. FOREIGN KEY (t_id)
  29. REFERENCES teilnehmer (t_id),
  30. CONSTRAINT fk_fragen
  31. FOREIGN KEY (f_id)
  32. REFERENCES fragen (f_id)
  33. );

Konzept

Ein Teilnehmer muss sich registrieren (Tabelle teilnehmer) und kann dann die Fragen (per ankreuzen) beantworten. Die Antworten werden in der Tabelle teilnehmer_antwort gesammelt. Zu jeder Frage gibt es nur eine korrekte Antwort. Die Fragen und die richtigen Antworten (Nr) sind in der Tabelle fragen gespeichert. Die Tabelle mit allen Antworten des Quiz (also die richtigen und die falschen, unter denen der Teilnehmer wählen kann) wird für die Auswertung nicht benötigt.

Testdaten

Für das nachfolgende Beispiel legen wir uns ein paar Testdaten an. Es werden drei Teilnehmer, drei Fragen, sowie die neun Antworten der Teilnehmer in die Datenbank eingelesen.

Listing 2:

  1. /**
  2. * Einfügen der drei Teilehmer
  3. */
  4. INSERT INTO teilnehmer (t_id, name ) VALUES
  5. (1, 'Teilnehmer-1'),
  6. (2, 'Teilnehmer-2'),
  7. (3, 'Teilnehmer-3');
  8. /**
  9. * Einfügen der drei Fragen
  10. */
  11. INSERT INTO fragen (f_id, frage, richtig) VALUES
  12. (1, 'Das ist die Frage 1', 1),
  13. (2, 'Das ist die Frage 2', 2),
  14. (3, 'Das ist die Frage 3', 2);
  15. /**
  16. * Einfügen der neun Antworten der Teilnehmer
  17. */
  18. INSERT INTO teilnehmer_antwort (ta_id, t_id, f_id, antwort) VALUES
  19. (1, 1, 1, 1),
  20. (2, 1, 2, 2),
  21. (3, 1, 3, 2),
  22. (4, 2, 1, 1),
  23. (5, 2, 2, 2),
  24. (6, 2, 3, 4),
  25. (7, 3, 1, 2),
  26. (8, 3, 2, 2),
  27. (9, 3, 3, 3);

SQL - Abfrage

Nun machen wir uns daran auszuwerten, welcher Teilnehmer alle Fragen korrekt beantwortet hat. Die SQL-Abfrage hierfür sieht so aus:

Listing 3:

  1. /**
  2. * Die Teilnehmer ermitteln, die alle Fragen korrekt beantwortet haben
  3. */
  4. SELECT t.name
  5. FROM teilnehmer t
  6. JOIN (SELECT t_id, COUNT(*) AS anzahl
  7. FROM teilnehmer_antwort ta
  8. JOIN fragen f
  9. ON ta.f_id = f.f_id
  10. AND ta.antwort = f.richtig
  11. GROUP BY t_id
  12. ) richtig
  13. ON richtig.t_id = t.t_id
  14. JOIN ( SELECT COUNT(*) AS anzahl FROM fragen) fragen
  15. ON richtig.anzahl = fragen.anzahl;
  16. +--------------+
  17. | name |
  18. +--------------+
  19. | Teilnehmer-1 |
  20. +--------------+
  21. 1 row in set (0.00 sec)

Der etwas komplexe Query ermittelt in mehreren Teilschritten das gewünschte Ergebnis. Der erste Sub-Select richtig liefert die Anzahl der richtigen Antworten pro Teilnehmer. Der zweite Sub-Select fragen zählt die Anzahl der notwendigen korrekten Antworten für dieses Quiz. Wenn jetzt diese beiden Werte richtig.anzahl = fragen.anzahl übereinstimmen, hat der Teilnehmer die richtige Menge an korrekten Antworten angekreuzt und wird als Ergebnis der Abfrage ausgegeben. In unserem Beispiel trifft dies auf den Teilnehmer Teilnehmer-1 zu.



Sitemap - Inhaltsverzeichnis

© 2002-2017 by Thomas Wiedmann : kontakt (at) twiedmann (punkt) de (Stand : 11.01.2015).