1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Quiz Datenbank - Multiple Choice mit Einzelkategorien

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Xorem, 4 September 2019.

  1. Xorem

    Xorem Neuer Benutzer

    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!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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...
     
  3. Xorem

    Xorem Neuer Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. Xorem

    Xorem Neuer Benutzer

    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.

    Muss ich was anderes als mysql nehmen?
    Wenn ja was, bisher kenne ich nur MySQL.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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...
     
  7. Dukel

    Dukel Datenbank-Guru

    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.
     
    Walter gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden