13. juni 2004 - 20:55Der er
30 kommentarer og 1 løsning
Vælg tilfældige poster i RS
Hejsa Jeg har denne SQL ------------------------ strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, status, marked from points where mdr = '" & MDR & "' AND aar= '" & AAR & "' GROUP BY status, marked ORDER BY Sum(points)"
Set rs = Conn.Execute(strSQL) ----------------------------
Hvis jeg gerne vil have retunerer X tilfældige poster fra mit rs hvordan gør jeg så det?
Access har ikke direkte en random indbygget så det må gøres i stil med dette:
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("abb.mdb") Set Conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.RecordSet") Conn.Open strDSN
strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, status, marked from points where mdr = '" & MDR & "' AND aar= '" & AAR & "' GROUP BY status, marked ORDER BY Sum(points)"
Rs.Open strSQL, Conn,1,3 antalRandom = 15 inDB = rs.RecordCount If inDB >= antalRandom then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound < antalRandom Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) myArr=split(strIndex,",",-1) For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1
' Udskriv her Response.Write rs("pointSum") & " " & rs("antalDeltagerer")
Rs.Open strSQL, Conn,1,3 'Sætter antal tilfældige poster der skal vises antalRandom = 15 'Finder antal poster ialt. inDB = rs.RecordCount If inDB >= antalRandom then Randomize timer 'Finder føste post som skal vises newId = Int (rnd*inDB) 'Laver en liste med nummeret posten ligger i recordset sådan den kan findes igen. strIndex = "," & newid & "," indexFound = 1 'Loop indtil der er fundet det ønskede antal Do while indexFound < antalRandom Do 'Find næste tilfældige post og tjek den ikke er fundet før Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop 'Så har man en liste med X antal tal som skal vises: strIndex = mid (strIndex,2,len(strIndex)-2) 'Fjern første komma myArr=split(strIndex,",",-1) 'Loop igennem alle de valgte poster For i = Lbound(myArr) to Ubound(myArr) 'Fylt til posten rs.move myArr(i),1
' Udskriv her Response.Write rs("pointSum") & " " & rs("antalDeltagerer")
Men hvis 2 har samme point antal vil jeg gerne have lavet en lodtrækning inden de får tildelt en plads og lagt i tabellen placeringer. Jeg fik lidt hjælp af "dp2001", men jeg tror han har misforstået problemet lidt. Jeg fandt selv en løsning på at få posterne flyttet, men som sagt er der et problem hvis 2 har samme pointantal...
En anden metode med Access er denne, hvor man finder et stor tilfældigt tal og ganger det med ID'et i databasen, så skulle den kunne sortere det tilfældigt:
<% randomize R=clng(100000*rnd) SQL = "SELECT TOP 1 * FROM Tabel ORDER BY rnd(-(ID)*" & R & ")" %>
Men når du har sum() og count() er der ikke noget ID på hver post.. Men hvis man du gange det på summen ville det måske virke?? Sådan dette (fra: 508384):
strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, brugerstatus, markedsstatus2 from points where uge = '" & UGE & "' AND aar= '" & AAR & "' GROUP BY brugerstatus, markedsstatus2 ORDER BY Sum(points)" Set rs = Conn.Execute(strSQL)
Bliver til:
randomize R=clng(100000*rnd) strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, brugerstatus, markedsstatus2 from points where uge = '" & UGE & "' AND aar= '" & AAR & "' GROUP BY brugerstatus, markedsstatus2 ORDER BY Sum(points), rnd(-(Sum(points))*" & R & ")" Set rs = Conn.Execute(strSQL)
Grunden til at jeg sorterer det efter Sum(points) i 508384 er at jeg så bare kan løbe rs'et igennem og få placeringerne på plads, den bruger med flest points ligger nummer 1 i rs'et og så videre. Men har X antal brugere samme Sum(points) vil jeg gerne at der mellem de X brugerer bliver lodtrækning om hvem der bliver nummer x og hver der bliver nummer x+1 og så videre
Ja det burgte det fakisk gøre, hvis man bruger summen, jeg havde bare tænkt på ID'et som gør en record unik.
Du kan evt. prøve sådan her, koden til dette spørgsmål.:
randomize R=clng(100000*rnd) strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, status, marked from points where mdr = '" & MDR & "' AND aar= '" & AAR & "' GROUP BY status, marked ORDER BY rnd(-(Sum(points))*" & R & ")"
Jeg tror ikke jeg er med på hvad forskellen er på ----------------- randomize R=clng(100000*rnd) strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, brugerstatus, markedsstatus2 from points where uge = '" & UGE & "' AND aar= '" & AAR & "' GROUP BY brugerstatus, markedsstatus2 ORDER BY Sum(points), rnd(-(Sum(points))*" & R & ")" Set rs = Conn.Execute(strSQL) -------------------------------
og
------------------------------- randomize R=clng(100000*rnd) strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, status, marked from points where mdr = '" & MDR & "' AND aar= '" & AAR & "' GROUP BY status, marked ORDER BY rnd(-(Sum(points))*" & R & ")"
Set rs = Conn.Execute(strSQL) -------------------------------------
Der er en order By mindre i den sidste, men hvad skulle jeg prøve med den sidste?
Den sidste post var et alternativ til dette spørgsmål løsning, der skulle måske også lige havde være TOP X inde i den.
randomize R=clng(100000*rnd) strSQL = "select TOP 15 DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, status, marked from points where mdr = '" & MDR & "' AND aar= '" & AAR & "' GROUP BY status, marked ORDER BY rnd(-(Sum(points))*" & R & ")"
randomize R=clng(100000*rnd) strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, brugerstatus, markedsstatus2 from points where uge = '" & UGE & "' AND aar= '" & AAR & "' GROUP BY brugerstatus, markedsstatus2 ORDER BY Sum(points), rnd(-(Sum(points))*" & R & ")" Set rs = Conn.Execute(strSQL)
Bliver ved med at retunerer den samme rækkefølge. Hvis det er de samme X antal brugerer der har lige mange points hverv uge - bliver deres rækkefølde den samme uge efter uge?
(13/06-2004 22:31:06) - giver denne fejl: ---------------------------------------------------- [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'DISTINCTROW Sum(points)'.
strSQL = "select TOP 15 Sum(points) AS pointSum, Count(*) AS antalDeltagerer, status, marked from points where mdr = '" & MDR & "' AND aar= '" & AAR & "' GROUP BY status, marked ORDER BY rnd(-(Sum(points))*" & R & ")"
>> Bliver ved med at retunerer den samme rækkefølge. Hvis det er de samme X antal brugerer der har lige mange points hverv uge - bliver deres rækkefølde den samme uge efter uge?
Så er det måske nok fordi den skal havde forskelligt tal i sum for det virker med rnd funktionen. Så har jeg ikke lige et forslag.
Problemet er at rnd(tal) giver samme tal hver gang. Så når summen er ens vil rnd(summen) også være ens :( så det går ikke umiddelbart.
Hvis antalDeltagere er forskellig kan du gange med antalDeltagere sådan her:
randomize R=clng(100000*rnd) strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, brugerstatus, markedsstatus2 from points where uge = '" & UGE & "' AND aar= '" & AAR & "' GROUP BY brugerstatus, markedsstatus2 ORDER BY Sum(points), rnd(-(Sum(points)*Count(*))*" & R & ")" Set rs = Conn.Execute(strSQL)
men hvis to har samme point sum, og samme antal deltagerer vil det give samme rækkefølge. Har du en kolonne som er autonummer?? Så kunne den bruge i stedet for Count(*). Man kunne sum(ID)*sum(pointsum)
randomize R=clng(100000*rnd) strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, brugerstatus, markedsstatus2 from points where uge = '" & UGE & "' AND aar= '" & AAR & "' GROUP BY brugerstatus, markedsstatus2 ORDER BY Sum(points), rnd(-(Sum(points)*sum(ID))*" & R & ")" Set rs = Conn.Execute(strSQL)
ok, sum(ID) kan for flere også være ens. Så hvis det skal være helt rigtigt bør man bruge + og ikke gange, og så MAX(ID) sådan sum(point)+MAX(id) ikke kan blive ens hvis sum(point) er ens :)
Så bliver SQL sætningen:
strSQL = "select DISTINCTROW Sum(points) AS pointSum, Count(*) AS antalDeltagerer, brugerstatus, markedsstatus2 from points where uge = '" & UGE & "' AND aar= '" & AAR & "' GROUP BY brugerstatus, markedsstatus2 ORDER BY Sum(points), rnd(-(Sum(points)+MAX(ID))*" & R & ")"
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.