Avatar billede thoj Nybegynder
20. september 2006 - 10:15 Der 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

Jeg leder efter et komplet kode eksempel
Avatar billede fennec Nybegynder
20. september 2006 - 10:58 #1
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))
Avatar billede thoj Nybegynder
20. september 2006 - 11:02 #2
Men jeg har også 3 forskellige alders grupper

Der skal udtrækkes 1 i den første, 2 i den næste og 3 i den sidste
Avatar billede fennec Nybegynder
20. september 2006 - 11:11 #3
Set rs = Server.CreateObject("ADODB.Recordset")
SQL = "SQL sætningen"
rs.Open SQL, Conn, 1
rs.MoveFirst
Randomize
rs.Move(int(rs.RecordCount * rnd()))
response.write "userID: "& rs("gid")

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.
Avatar billede thoj Nybegynder
20. september 2006 - 11:14 #4
Fennec du har helt ret

Men normalt laver jeg selv php og syntes at VB/asp er svært at holde styr på/finde rundt i

Men det er min såkaldte "værkfører" der mente at det var den bedste måde at løse det på,  og til sidst gad jeg prøve at forklare det mere :D

Men jeg kan ikke helt SQL sætning til at virke :(
Avatar billede fennec Nybegynder
20. september 2006 - 11:22 #5
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?
Avatar billede fennec Nybegynder
20. september 2006 - 11:23 #6
SQL'en ville så bliver:

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)
Avatar billede thoj Nybegynder
20. september 2006 - 11:24 #7
Har jeg gjort nu, men får denne fejl

Microsoft JET Database Engine error '80040e14'

Syntax error in FROM clause.

/hjort.asp, line 11
Avatar billede fennec Nybegynder
20. september 2006 - 11:46 #8
Hvilken version af Access kører du??
Jeg kører nemlig på en 2002...
Avatar billede thoj Nybegynder
20. september 2006 - 12:15 #9
Jeg bruger 2003

Men skal jeg bruge den første eller sidste SQL sætning ?
Avatar billede fennec Nybegynder
20. september 2006 - 12:25 #10
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.
Avatar billede fennec Nybegynder
20. september 2006 - 12:26 #11
så lige at du har angivet "qcorrect = text" i dit ?. Det er vel en taste fejl fra din side, da det burde være et nummer.
Avatar billede thoj Nybegynder
20. september 2006 - 12:36 #12
Hmm

Her er en kopi af min DB og kode, jeg ved ikke om du kan se fejlen

www.fumle.com/kopi.rar
Avatar billede thoj Nybegynder
20. september 2006 - 12:40 #13
Hmm, den server virker ikk

www.troy-data.dk/kopi.rar
Avatar billede thoj Nybegynder
20. september 2006 - 13:21 #14
Jeg får denne fejl når jeg bruger den anden sql sætning

Microsoft JET Database Engine error '80040e14'

Extra ) in query expression '(COUNT(gid) = 5))'.

/index.asp, line 13
Avatar billede fennec Nybegynder
20. september 2006 - 13:31 #15
denne virker når jeg kører den i din database:

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))
Avatar billede thoj Nybegynder
20. september 2006 - 14:05 #16
Det virkede :D thx

smid svar
Avatar billede fennec Nybegynder
20. september 2006 - 14:18 #17
.o) <-- One Eyed Jack
Avatar billede thoj Nybegynder
20. september 2006 - 14:32 #18
Kan du lige hjælpe mig lidt mere med at vælge de 6 og lægge i en anden tabel og tjekker om der er noget iden inden at den vælger de 6 personer ?
Avatar billede fennec Nybegynder
20. september 2006 - 15:13 #19
Den skal jeg vist lige have en gang til.
Jeg har en utrolig dårlig opfattelsesevne idag :o)
Avatar billede thoj Nybegynder
21. september 2006 - 08:15 #20
Jo

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
Avatar billede fennec Nybegynder
21. september 2006 - 09:32 #21
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.
Avatar billede thoj Nybegynder
21. september 2006 - 09:48 #22
Jeg kan sikkert godt selv løse det herfra

Men tak for alt den hjælp du har givet, du har rimlig styr på din SQL
Avatar billede thoj Nybegynder
22. september 2006 - 09:16 #23
Jeg har brug for lidt mere hjælp hvis du har tid

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 :)
Avatar billede fennec Nybegynder
22. september 2006 - 09:35 #24
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.
Avatar billede thoj Nybegynder
22. september 2006 - 09:44 #25
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

kig evt her

http://www.eksperten.dk/spm/733944
Avatar billede fennec Nybegynder
22. september 2006 - 10:08 #26
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.
Avatar billede thoj Nybegynder
22. september 2006 - 11:07 #27
Hmm

Den vælger stadigvæk personer fra andre grupper, jeg tror stadig at det SQL sætningen der fejler hos mig..

Kig evt her hvis du gider og har tid

http://www.fumle.com/asp.rar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I går 23:37 Poe strøm Af lurup i LAN/WAN
I går 14:46 GIF-EDITOR Af snestrup2000 i Billedbehandling
I går 14:03 Logge ind Af Bob i PC
I går 12:12 2 skærme - 1 virker - den anden siger No signal Af eksmojo i Skærme
I går 10:33 openvpn projekt Af dcedata1977 i Windows