Quiz Datenbank - Multiple Choice mit Einzelkategorien

Xorem

Neuer Benutzer
Beiträge
3
Hallo,

ich bin noch Anfänger was Datenbanken angeht, auch wenn das Erstellen und das Abrufen etc. schon gut funktioniert.

Ich möchte gerne ein Quiz erstellen, dieses wird per PHP umgesetzt. (Vergleichbar zu "Wer weiß denn sowas..?")
Es wird aus einer Sammlung von 12 unterschiedlichen (!) Kategorien eine Kategorie ausgewählt und anschließend eine passende Frage dazu gestellt. Diese hat drei Antwortmöglichkeiten und anschließend wird ein Video/Bild gezeigt.

Mein Datenbankdesign sieht aktuell so aus - vermutlich nicht vollständig normalisiert, da es ja mehrere Abhängigkeiten gibt. (Tipps gerne willkommen!) Die Fragen hinter id 02, 06 und 09 sind jeweils unterschiedlich.
Code:
+--+---------+-----+--------+--------+-------+---------+
|id|kategorie|frage|auswahl1|auswahl2|antwort|videolink|
+--+---------+-----+--------+--------+-------+---------+
|01|  Sport  |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|02|  Damals |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|03|  Heute  |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|04|  Politik|.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|05|  Musik  |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|06|  Damals |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|07|  Sport  |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|08|  Heute  |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|09|  Damals |.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+
|..|.........|.....|........|........|.......|.........|
+--+---------+-----+--------+--------+-------+---------+

Ich würde gerne für die 12 Fragen, die ausgewählt werden können immer distinkte Kategorien haben.
Das schaffe ich auch über folgenden Code:
PHP:
<?php
        $pdo = new PDO(....);

  echo '<p>Quizfragen:</p><hr>';
$sql = "SELECT DISTINCT kategorie FROM questions ORDER BY RAND() LIMIT 12";
foreach ($pdo->query($sql) as $row) {
   echo " - Kategorie: ".$row['kategorie'];
   echo "<br><hr>";
}
?>
Die Ausgabe sind dann 12 unterschiedliche Kategorien ohne Dopplungen. Allerdings bekomme ich nach dieser Auswahl nicht mehr verschiedene Fragen passend zu den Kategorien ausgewählt.

Ziel:
Ein Script ruft aus allen möglichen Kategorien (200-300 Stück zur Auswahl) 12 zufällige Kategorien ab, anschließend nimmt es die dazu passende Frage und stellt diese dar.

Idee:
Ich dachte, ich könnte mit einem passenden PHP Skript 12 unterschiedliche Kategorien auswählen und gleichzeitig die ID, Frage, Antworten etc. auswählen und dann weiterverarbeiten. Also quasi die komplette Zeile bearbeiten, nachdem durch die Spalte "kategorie" zufällig und einzigartig/distinkt ausgewählt wurde. Leider funktioniert das nicht.

Ich hoffe jemand von euch kann mir helfen und ich habe nicht irgendwas wichtiges vergessen.

Liebe Grüße!
 
Werbung:
Hrm, ich bin mir nicht sicher, ob ich Dich richtig verstanden habe...

Ich erzeuge eine Tabelle:

Code:
test=# create table xorem(id serial primary key, kategorie text, frage text);
CREATE TABLE
test=*# insert into xorem (kategorie , frage) select 'Kategorie ' || k::text, 'Frage ' || random()::text from generate_series(1,12)k cross join generate_series(1,1000) x;
INSERT 0 12000

Aus dieser willst Du jetzt je Kategorie eine zufälllige Frage?

Code:
test=*# with fragen as (select distinct on (kategorie) id from xorem order by kategorie, random()) select * from xorem where id in (select id from fragen);
  id   |  kategorie   |           frage           
-------+--------------+---------------------------
   103 | Kategorie 1  | Frage 0.6848331529214562
  1750 | Kategorie 2  | Frage 0.6909608059359478
  2155 | Kategorie 3  | Frage 0.18357568343245134
  3261 | Kategorie 4  | Frage 0.8703990607338667
  4624 | Kategorie 5  | Frage 0.08257242582308422
  5307 | Kategorie 6  | Frage 0.5904962323190546
  6681 | Kategorie 7  | Frage 0.08823807862579969
  7830 | Kategorie 8  | Frage 0.5842377289998701
  8727 | Kategorie 9  | Frage 0.04882467962382009
  9822 | Kategorie 10 | Frage 0.03511003825811443
 10101 | Kategorie 11 | Frage 0.4164879394115033
 11738 | Kategorie 12 | Frage 0.47849772675170144
(12 rows)

test=*# with fragen as (select distinct on (kategorie) id from xorem order by kategorie, random()) select * from xorem where id in (select id from fragen);
  id   |  kategorie   |           frage           
-------+--------------+----------------------------
   152 | Kategorie 1  | Frage 0.7035299134539024
  1291 | Kategorie 2  | Frage 0.9563267853614263
  2347 | Kategorie 3  | Frage 0.9631845908749312
  3029 | Kategorie 4  | Frage 0.6403800045043582
  4819 | Kategorie 5  | Frage 0.41677167204903753
  5318 | Kategorie 6  | Frage 0.1478997584047086
  6490 | Kategorie 7  | Frage 0.4741054519339549
  7662 | Kategorie 8  | Frage 0.054544677618441284
  8788 | Kategorie 9  | Frage 0.26123879787324356
  9643 | Kategorie 10 | Frage 0.8050594060279366
 10979 | Kategorie 11 | Frage 0.5324426753242051
 11286 | Kategorie 12 | Frage 0.6229950722375186
(12 rows)

test=*#

Paßt das? Ist aber kein MySQL...
 
Ich glaube du verstehst mich richtig.
Ich möchte aber eigentlich eine zufällige Kategorie und davon abhängig dann die passende Frage, die in einer hinteren Spalte steht.

Ich habe vorne fortlaufende ids, danach die Kategorien, davon gibt es ca. 200-300 verschiedene und insgesamt ca. 900 Fragen, die alle irgendeiner Kategorie zugeordnet sind. Hier gibt es Dopplungen, mehrere Fragen mit der gleichen Kategorie bspw. "Damals" oder "Sport"

Für eine Quizdurchführung brauche ich von den, sagen wir, 300 Kategorien aber nur 12 Stück. Diese sollen aber alle unterschiedlich sein, also nicht zwei mal eine "Sport"-Frage. Nachdem 12 Kategorien willkürlich ausgewählt wurden, möchte ich gerne die dahinterstehenden Fragen, Antworten, Einträge aus der entsprechenden Zeile haben und weiterverarbeiten.

Mein Problem ist glaube ich der Aufbau der Datenbank.
Im Grunde kann ich es glaube auch aufsplitten in mehrere Abfragen.
1. Abfrage: Suche 12 unterschiedliche Kategorien.
2. Abfrage: Suche zu jeder der 12 Kategorien eine zufällige Frage, die dieser Kategorie zugeordnet ist.
3. Verarbeite die Frage wie auch immer weiter...

Ich hänge nur leider an meinem eigenen Denkfehlern.
 
Nun denn, dann erweitern wir das mal:

Code:
test=# with fragen as (select distinct on (kategorie) id from xorem order by kategorie, random()) select * from xorem where id in (select id from fragen) order by random() limit 3;
  id  |  kategorie   |          frage           
------+--------------+--------------------------
 2867 | Kategorie 3  | Frage 0.6476719899137038
 5510 | Kategorie 6  | Frage 0.7300347285717983
 9567 | Kategorie 10 | Frage 0.3252545828389515
(3 rows)

test=*# with fragen as (select distinct on (kategorie) id from xorem order by kategorie, random()) select * from xorem where id in (select id from fragen) order by random() limit 3;
  id   |  kategorie   |           frage           
-------+--------------+---------------------------
 11383 | Kategorie 12 | Frage 0.3081237967255248
  4983 | Kategorie 5  | Frage 0.08823085417425602
  3513 | Kategorie 4  | Frage 0.9011462937044641
(3 rows)

test=*# with fragen as (select distinct on (kategorie) id from xorem order by kategorie, random()) select * from xorem where id in (select id from fragen) order by random() limit 3;
  id  |  kategorie  |           frage           
------+-------------+---------------------------
 3593 | Kategorie 4 | Frage 0.342745250782734
 8836 | Kategorie 9 | Frage 0.13115786734378432
 2011 | Kategorie 3 | Frage 0.6969774718880615
(3 rows)

test=*#

Nun hast von den N Kategorien 3 zufällige.
 
Das sieht gut aus, nur leider bekomme ich es nicht umgesetzt.

PHP:
<?php
        $pdo = new PDO(....);
  echo '<p>Quizfragen:</p><hr>';
$sql = "SELECT * FROM questions WHERE id IN (SELECT id FROM questions) ORDER BY random() LIMIT 3";
foreach ($pdo->query($sql) as $row) {
   echo "ID: ".$row['id'];
   echo "Kategorie: ".$row['kategorie'];
   echo "<br><hr>";
}
?>

Ich wollte deine Zeile gerne für meine $sql Variable einsetzen, läuft nur leider nicht. Natürlich angepasst auf meine Tabelle "questions".
Warning: Invalid argument supplied for foreach() on line 27.

Paßt das? Ist aber kein MySQL...
Muss ich was anderes als mysql nehmen?
Wenn ja was, bisher kenne ich nur MySQL.
 
Dein PHP-Code enthält KEINERLEI Error-Handling, das ist aber ein PHP-Problem und hier offtopic.

Ob Du MySQL oder was anderes nimmst ist natürlich Deine Sache. Das Du keine weiteren Datenbanken kennst - nun ja. Sich umzuschauen, was es noch so gibt kann manchmal hilfreich sein.
Mein gezeigtes SQL wird mit MySQL sehr wahrscheinlich nicht laufen. Vielleicht in 10 Jahren, wenn MySQL mal vollständig ist...
 
Werbung:
Ich würde die Kategorien in eine eigenen Tabelle auslagern.
Wenn du die Daten pflegst und (ausversehen) einmal "Sport" und einmal "Spord" schreibst hättest du eine weitere Kategorie, die du nicht haben willst.
 
Zurück
Oben