Ik heb een quiz, en per dag mogen bezoekers hier 20 vragen invullen, maar ik zou graag willen dat ze geen dubbele vragen te zien krijgen.

Ik heb 3 tabellen, een met quizvragen, een met quiz antwoorden en een met de gegeven antwoorden.

ik heb de volgende query gemaakt:
$query = "SELECT
              quizvragen.*
           FROM
              quizvragen,
              quiz_gegevenantwoorden
           WHERE
               quiz_gegevenantwoorden.vraagID != quizvragen.id
            ORDER BY
               RAND() LIMIT 1";


maar deze lijkt niet te werken.

tabelstructuren
CREATE TABLE `quizvragen` (
  `id` int(11) NOT NULL auto_increment,
  `vraag` varchar(255) NOT NULL default '',
  `goedeantwoord` int(11) NOT NULL default '0',
  `actief` enum('1','0') NOT NULL default '1',
  `ingevoerd` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=26 ;

CREATE TABLE `quiz_gegevenantwoorden` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(100) NOT NULL default '',
  `vraagID` int(11) NOT NULL default '0',
  `antwoordID` int(11) NOT NULL default '0',
  `tijd` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=53 ;
Het lijkt mij dat vraag en antwoord een 1:1 relatie is, dus die zou ik in dezelfde tabel zetten.
[edit]Oh wacht, dat heb je al. "goedeantwoord"[/edit]
@Jan: je hebt deels gelijk ware het niet dat het meerkeuzevragen zijn en er verschillende aantallen antwoorden per vraag kunnen voorkomen, daarom heb ik ervoor gekozen om de antwoorden in een aparte tabel samen met het id van de vraag op te slaan.
Oké, maar elke vraag heeft maar 1 goed antwoord en elke user kan maar 1 antwoord per vraag geven toch?
@Jan, dat is nu net het probleem, elke vraag die beantwoord wordt, wordt in de tabel quiz_gegevenantwoorden gezet, of het antwoord nu goed of fout is.

het gaat niet over het aantal goede/foute antwoorden dat een vraag kan hebben.

Het gaat mij erom dat er iedere keer random een vraag geselecteerd wordt uit de tabel quizvragen, alleen ik wil dat er aan de hand van de tabel quiz_gegevenantwoorden gezorgd wordt dat een user niet twee keer dezelfde vraag te zien krijgt.
toch een voorzichtige kick, dit is het enige kleine probleem waar ik nog tegenaan loop en wil het graag vanavond online hebben.
@ Stefan

Je zorgt er dus voor dat de vragen die de user al beantwoord heeft niet meer geselecteerd kunnen worden. Dat bedoel je toch eh ?

Het eerste deel selecteert alle vragen die je wil. De tweede select gaat alle ID's zoeken van username stefan. Deze worden niet meer in de selectie opgenomen. Er wordt dan random 1 uitgekozen uit de selectie zonder de ingevulde vragen.

SELECT * from quizvragen
WHERE id NOT IN (
SELECT vraagID FROM quiz_gegevenantwoorden
WHERE username <> 'Stefan'
)
ORDER BY RAND() LIMIT 1";
@Stefan
Bumpen is toegestaan na 24 uur. De volgende keer sluit ik het topic.
@Bjorn: een subquery, dat kan natuurlijk ook inderdaad, misschien werkt het wel, maar als ik het probeer krijgt ik de foutmelding:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY RAND()' at line 1

Ik heb even de volledige code gezet op:
http://plaatscode.be/6279/

Alleen van regel 24 kan die fout vandaan komen omdat dat de enige query is met rand() die op 1 regel staat.
Ik weet alleen niet waarom hij die fout geeft.
Waarschijnlijk komt het omdat de variabele $row['id'] geen waarde bevat, dat heb ik ook zojuist even getest, en dat blijkt het geval, alleen waarom? Eerst was dit namelijk niet het geval.

@PhpErik: sorry, ik weet het wel hoor, maar ik heb eigenlijk vanavond nodig, als het echt moet gooi ik hem voorlopig zonder die controle online, maar met is natuurlijk wel beter.

Reageren