/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Count
Fra : Thomas Møller Nexø


Dato : 15-11-03 19:02

Hejsa,

Jeg har siddet og rodet med et problem og er nu ved at blive lidt
træt af dette.
Jeg forsøger at lave en afstemning, hvor det ud fra en dropdown
menu skal være muligt at stemme på en spiller - disse hentes fra
en database, men nok om det.

Jeg har så en tabel, hvor dette spillernavn skrives til når man
har stemt.

Mit problem er nu, at jeg, når en bruger har stemt, gerne vil
vise resultatet af afstemningen.
Jeg vil altså gerne gennemløbe tabellen med stemmerne
(spillernavnene) og tælle disse op, skrive antallet sammen med
det givne spillernavn og evt. kun trække de tre spillere med
flest stemmer ud og vise disse.

Hvordan kan dette nemmest gøres?
Jeg har forsøgt med Count as Antal, men da jeg ikke ved præcist
hvor hvilke navne der optræder i afstemningen fra gang til gang
(bliver valgt i et admin modul) kan jeg ikke rigtigt bruge denne
metode.

Nogen ideer?

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jens Gyldenkærne Cla~ (15-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 15-11-03 22:30

Thomas Møller Nexø skrev:

> Jeg vil altså gerne gennemløbe tabellen med stemmerne
> (spillernavnene) og tælle disse op, skrive antallet sammen med
> det givne spillernavn og evt. kun trække de tre spillere med
> flest stemmer ud og vise disse.

Du har ikke fortalt hvilken database du benytter - det er ikke
uvæsentligt. I Access og MSSQL m.fl. kan du bruge følgende:

SELECT TOP 3 spillernavn, count(*) as antal
GROUP BY spillernavn
ORDER BY count(*) DESC

I mysql virker "TOP 3" ikke - her bruger man i stedet LIMIT som jeg
ikke præcist kan huske syntaksen for.

Sætningen ovenfor tager ikke hensyn til at der kan være flere
spillere med samme stemmeantal.

Hvis spillernavnet ligger i en anden tabel end selve stemmerne (så
der fx kun er et spillerID i stemmetabellen), kan man stadig godt
lave sammentællingen i sql - man skal blot lave et join til
navnetabellen og gruppere på navn og id.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Thomas Møller Nexø (16-11-2003)
Kommentar
Fra : Thomas Møller Nexø


Dato : 16-11-03 02:07

Mange tak for dit svar Jens!

> Du har ikke fortalt hvilken database du benytter - det er ikke
> uvæsentligt. I Access og MSSQL m.fl. kan du bruge følgende:

Jeg benytter Access.

> SELECT TOP 3 spillernavn, count(*) as antal
> GROUP BY spillernavn
> ORDER BY count(*) DESC

Jeg har sat det op som følger:

Set RsAfstemning = Server.CreateObject("ADODB.Recordset")
RsAfstemning.Open "SELECT TOP 3 Spiller, count(*) AS Antal GROUP
BY Spiller ORDER BY count(*) DESC", Conn

Men får nu følgende fejlmeddelelse:

Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access-driver] SELECT-sætningen indeholder
et reserveret ord eller argument, der er stavet forkert eller mangler,
eller tegnsætningen er ikke korrekt.

Kolonnen jeg vil tælle op på hedder "Spiller".

Kan du se hvad der er galt Jens?
På forhånd mange tak.

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Thomas Møller Nexø (16-11-2003)
Kommentar
Fra : Thomas Møller Nexø


Dato : 16-11-03 13:58

Kunne som sagt ikke helt få det til at virke som du skrev Jens, men
tilføjede en smule til den sql-sætning du skrev til mig.
Jeg har nu fået det til at virke, men vil egentlig gerne (ud over at
videregive mit resultat til andre med evt. samme problem) have en
vurdering fra nogle af jer andre omkring performance etc. med den
nuværende løsning. Altså om det er hensigtsmæssigt eller totalt hen i
vejret.

Resultatet er som følger:

' Subroutine med beregninger til visning af resultat
Sub VisAfstemningsResultat
   
   ' Aabner afstemning og viser 3 spillere med flest stemmer
   Set RsAfstemning = Server.CreateObject("ADODB.Recordset")
      RsAfstemning.Open "Select TOP 3 Spiller, COUNT(*) FROM afstemning GROUP
BY Spiller ORDER BY COUNT(*) DESC", Conn
         
         ' Samlet antal stemmer optaelles
         intSamletAntal = "Select COUNT(Spiller) As SamletAntal From
afstemning"
            Set RsSamletAntal = Conn.Execute(intSamletAntal)
         
            Response.Write "<table width='210' border='0' cellpadding='0'
cellspacing='0' align='left'>"
            
            ' Loekke hvor flest stemte spillere vises
            Do While Not RsAfstemning.EOF
         
               Response.Write "<tr align='center' valign='top'>"
               
                  Response.Write "<td width='140' align='left' valign='top'>"
                     Response.Write RsAfstemning("Spiller")
                  Response.Write "</td>"
                  
                  ' Antal stemmer for given spiller taelles
                  intAntal = "Select COUNT(Spiller) As Antal From afstemning Where
Spiller = '" & RsAfstemning("Spiller") & "'"
                     Set RsAntal = Conn.Execute(intAntal)
                  
                  Response.Write "<td width='10' align='center' valign='top'>"
                     Response.Write RsAntal("Antal")
                  Response.Write "</td>"
                  
                  ' Procenten af samlet antal stemmer findes
                  ProcentStemmer = (RsAntal("Antal")/RsSamletAntal("SamletAntal") *
100)
                  
                  Response.Write "<td width='60' align='center' valign='top'>"
                     Response.Write "(" & Left((ProcentStemmer), 4) & " %)"
                  Response.Write "</td>"
                  
               Response.Write "</tr>"
            
            RsAfstemning.MoveNext         
            Loop
            
               ' Samlet antal stemmer udskrives
               Response.Write "<tr align='center' valign='top'>"
                  Response.Write "<td colspan='3' width='210' align='center'
valign='top'>"
                     Response.Write "<BR><strong>" & "Antal stemmer i alt: " &
RsSamletAntal("SamletAntal") & "</strong>"
                  Response.Write "</td>"
         
            Response.Write "</table>"
         
         ' Luk forbindelsen til antal per spiller
         RsAntal.Close
         Set RsAntal = Nothing
         
         ' Luk forbindelsen til samlet antal
         RsSamletAntal.Close
         Set RsSamletAntal = Nothing
         
         ' Luk forbindelsen til afstemningstabellen
         RsAfstemning.Close
         Set RsAfstemning = Nothing
End Sub

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jens Gyldenkærne Cla~ (16-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 16-11-03 23:35

Thomas Møller Nexø skrev:

> Kunne som sagt ikke helt få det til at virke som du skrev
> Jens,

Det kan jeg godt forstå - som jeg har skrevet andetsteds, mangler
der et obligatorisk element (FROM tabelnavn) i det eksempel jeg
gav.

> men tilføjede en smule til den sql-sætning du skrev til mig.

Glimrende.

> ...have en vurdering fra nogle af jer andre omkring
> performance etc. med den nuværende løsning. Altså om det er
> hensigtsmæssigt eller totalt hen i vejret.

O.k.


> Set RsSamletAntal =
> Conn.Execute(intSamletAntal)

Her ville jeg nok lægge værdien fra RsSamletAntal over i en
variabel og så lukke postsættet igen med det samme. Godt nok
udskriver du kun tre poster fra det andet postsæt, men
RsSamletAntal indeholder jo kun én post med ét felt - og det kan
lige så godt hentes til en asp-variabel så man kan lukke postsættet
igen.


> ' Antal stemmer for given
> spiller taelles
> intAntal = "Select
> COUNT(Spiller) As Antal From
> afstemning Where
> Spiller = '" & RsAfstemning("Spiller") & "'"


Hov - hvorfor vil du tælle stemmeantallet igen? Du har jo allerede
stemmeantallet liggende i RsAfstemning("antal") - så ovenstående er
decideret resursespild.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jens Gyldenkærne Cla~ (16-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 16-11-03 23:27

Thomas Møller Nexø skrev:

>> SELECT TOP 3 spillernavn, count(*) as antal

-> Her mangler en FROM-linje (der angiver hvilken tabel der skal
hentes data fra.

>> GROUP BY spillernavn
>> ORDER BY count(*) DESC


> Set RsAfstemning = Server.CreateObject("ADODB.Recordset")
> RsAfstemning.Open "SELECT TOP 3 Spiller, count(*) AS
> Antal GROUP
> BY Spiller ORDER BY count(*) DESC", Conn

- og den samme fejl opstår så her.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste