20. september 2006 - 10:15Der er
26 kommentarer og 1 løsning
Compare i array
Jeg skulle lave en quiz side i asp og jeg skal finde en måde at finde en vinder på
Jeg tænkte på at lave en array hvor at id og det korrekte svar blive hentet ind i og de svar som er givet af de personer der har deltaget og jeg skal så sammenligne dem for at tjekke hvor mange rigtige svar der, hvis der en der har 10 rigtige har han vundet
Er der flere der har svaret rigtigt på 10, skal der trækkes lod imellem dem
databasen er lavet i access
Questions: qid nummer autoinc qtest text qoption1 text qoption2 text qoption3 text qoption4 text qcorrect text qgroup text
Answer
aid nummer autoinc gid nummer Pointer til guest ID qid nummer pointer til Questions ID asvar nummer
Det er qcorrect og asvar der skal sammenlignes med hinanden og der vælges en vinder med
Der står kun et 1 svar på per spørgsmål i hver record
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Denne SQL burde automatisk trække alle personer ud som har flest rigtige svar. Der skal så laves en random på resultaterne (har jeg ikke lavet endnu, men komme straks)
SELECT gid, COUNT(gid) AS correctAnswers FROM (SELECT a.* FROM aaAnswer a INNER JOIN aaQuest q ON a.qid = q.id AND a.asvar = q.qcorrect) DERIVEDTBL GROUP BY gid HAVING (COUNT(gid) = (SELECT MAX(correctAnswers) AS Expr1 FROM (SELECT COUNT(gid) AS correctAnswers FROM (SELECT a.* FROM aaAnswer a INNER JOIN aaQuest q ON a.qid = q.id AND a.asvar = q.qcorrect) DERIVEDTBL GROUP BY gid) DERIVEDTBL))
Angående dine alders grupper så bliver det MEGET indviklet. Hvad nu hvis EN har alle rigtige og 5 har en forkert. Ved din sidste gruppe har den først vundet, mens der skal trækkes lod bland de 5 om 2 vinderpladser.
Tror du selv skal styre lidt af det. Var at udskifte: HAVING (COUNT(gid) = ....
med HAVING (COUNT(gid) = 5)
Kan du specifikt søge efter dem som har 5 rigtige. Du kan så på den måde tjekke hvor mange der har x antal rigtige svar. Derefter kan du så køre en random på resultaterne indtil du har fundet x antal vindere.
F.eks med det før omtale eks (hvis der var 5 spørgsmål), ville den første søgning give 1 resultat, og du mærkere så den person som vinder. Dernæst får du 5 resultater og ved så at du skal køre en random på dem, til du har 2 resultater (samme resultat kan jo blive trukket 2 gang), og du mærkere så dem som vindere.
Mine test-tabeller hedder aaAnswer og aaQuest, har du ombøbt dem til dine navne?
SELECT gid, COUNT(gid) AS correctAnswers FROM (SELECT a.* FROM aaAnswer a INNER JOIN aaQuest q ON a.qid = q.id AND a.asvar = q.qcorrect) DERIVEDTBL GROUP BY gid HAVING (COUNT(gid) = 5)
Det komme an på om du vil styre søgningen selv. Den første jeg lavede finde selv ud af hvor mange svar, der skal til for at ligge i toppen, og finder så alle dem som har det antal rigtige svar.
Den anden bestem du selv hvilken "antal rigtige svar" gruppe, der skal vises.
SELECT gid, COUNT(gid) AS correctAnswers FROM (SELECT a.* FROM Answer a INNER JOIN Questions q ON a.qid = q.qid AND a.asvar = q.qcorrect) DERIVEDTBL GROUP BY gid HAVING (COUNT(gid) = (SELECT MAX(correctAnswers) AS Expr1 FROM (SELECT COUNT(gid) AS correctAnswers FROM (SELECT a.* FROM Answer a INNER JOIN Questions q ON a.qid = q.qid AND a.asvar = q.qcorrect) DERIVEDTBL GROUP BY gid) DERIVEDTBL))
i qgroup feltet er der værdi 1,2,3 og jeg skal udtrække 1 fra 1, 2 fra 2 og 3 fra 3 :D Og det skal jeg have ud på liste på skærmen og lægge det i database på samme tidspunkt
Også ville jeg prøve at lave en if funktion der skulle tjeckke om der stod noget i databasen i forvejen så ikke valgte 6 nye
Har super travlt i dag, så du får kun pseudo kode:
1. Find MAX antal rigtige svar for en gruppe: SELECT MAX(correctAnswers) AS MaxCorrect FROM (SELECT COUNT(gid) AS correctAnswers FROM (SELECT a.* FROM Answer a INNER JOIN Questions q ON a.qid = q.qid AND a.asvar = q.qcorrect Where qgroup = 1) DERIVEDTBL GROUP BY gid 2. Find personer med det antal, som ikke er i winner tabellen: SELECT gid, COUNT(gid) AS correctAnswers FROM (SELECT a.* FROM Answer a INNER JOIN Questions q ON a.qid = q.qid AND a.asvar = q.qcorrect where gID not in (select gID from winner) ) DERIVEDTBL GROUP BY gid HAVING (COUNT(gid) = MaxCorrectFraFør) 3. Tæl antal fundende personer (rs.recordCount) 4. Er den 0 så kør 2 igen med MaxCorrectFraFør-1 indtil rs.recordCount >= 1 eller MaxCorrectFraFør = -1 (Ikke nok personer har gættet) 5. Find en random vinder blandt resultaterne fra punkt 2, og gem brugerne i [winner] tabellen. 6. Kør 2-5 indtil det fulde antal vindere for gruppen er fundet 7. Kør 1-6 for de næste grupper.
1. Jeg skal også funktionen til at vise navnet også på vinderen 2. Jeg kan ikke få den til at skelne på grupper, den finder en vinder fra gruppe 2 selv om jeg siger at kan skal vælge gruppe 1
Men det er kun hvis du har tid til det, jeg skal bare have min "chef" væk :)
Går ud fra at du henviser til gAlder i guest tabellen som skal modsvare qGroup i Questions... Der kommer dit problem pga data som ikke burde kunne være der. F.eks burde Mikkel og Frede slet ikke kunne svare på nogle af ?'ende (pånær 11), da alle ? tilhører qGroup 1.
Kunne lige være at jeg skulle lidt i min db, fordi jeg har bare ændret deres gruppe manuelt, men de tilhører jo ikke de spørgsmål, kan være at jeg lige skulle oprette nogle spørgsmål og teste med
Hele ideen bag opbygningen, er at brugerne kun har svart på de ?, som er i deres gruppe.
Da det kun er Thomas og Superman, som tilhøre gruppe 1 (i den database jeg fik), er de de eneste som burde kunne svare på ? 1-10, men både Mikkel og Frede har også svaret på de ?, og derfor kommer de ud som resultat.
Hvis du bare overholder reglen om at brugerne kun kan svare på ?, som er i deres gruppe, har problemet løst sig selv.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.