Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 20:55 Der 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?
Avatar billede eagleeye Praktikant
13. juni 2004 - 20:57 #1
Hvilken database bruger du?
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 21:01 #2
access
Avatar billede eagleeye Praktikant
13. juni 2004 - 21:14 #3
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")
   

  next
end if
Rs.Close
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 21:24 #4
kan man få en hurtig forklaring med?
Avatar billede eagleeye Praktikant
13. juni 2004 - 21:31 #5
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")
   
  next
end if
Rs.Close
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 21:39 #6
Det er smart ;-)
Kan du ikke lige smide et svar?

og hvis du her tid kigge på den her: http://www.eksperten.dk/spm/508384 ?
Avatar billede eagleeye Praktikant
13. juni 2004 - 21:39 #7
Jo et svar :)
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 21:46 #8
Problemet i http://www.eksperten.dk/spm/508384 er at jeg der har en tabel med alle placeringerne for en given uge.

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...
Avatar billede eagleeye Praktikant
13. juni 2004 - 21:53 #9
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)
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:06 #10
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

Er problemet klart nok?
Avatar billede eagleeye Praktikant
13. juni 2004 - 22:16 #11
Ja jeg forstår problemet. Har du prøvet mit forslag??

Den order by summen af point og er de ens bruges næste som skulle lave en random order, hvor 2 eller flere er ens.
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:19 #12
Ahh - det havde jeg ikke set at der var 2 orderby - vil det også virke med X antal?
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:22 #13
Jeg tror det spiller - jeg vil lige teste det lidt mere, men jeg synes det ser super nice ud
Avatar billede eagleeye Praktikant
13. juni 2004 - 22:22 #14
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 & ")"

Set rs = Conn.Execute(strSQL)
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:28 #15
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?
Avatar billede eagleeye Praktikant
13. juni 2004 - 22:31 #16
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 & ")"



Den fsøte (13/06-2004 21:53:03) var til det andet spørgsmål http://www.eksperten.dk/spm/508384
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:37 #17
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?

Tester lige (13/06-2004 22:31:06)
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:40 #18
(13/06-2004 22:31:06) - giver denne fejl:
----------------------------------------------------
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'DISTINCTROW Sum(points)'.
Avatar billede eagleeye Praktikant
13. juni 2004 - 22:41 #19
til den sidste prøv uden DISTINCTROW :

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 & ")"
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:43 #20
Så bliver det:
-------------------------
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.
Avatar billede eagleeye Praktikant
13. juni 2004 - 22:43 #21
>> 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.
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:44 #22
13/06-2004 22:43:37 -->> det er min fejl
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:48 #23
Jeg tror 13/06-2004 22:41:51 virker

Men jeg har statig bøvl med: 13/06-2004 22:37:55
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 22:57 #24
Jeg har nu testet 13/06-2004 22:41:51 - det virker 100%
Avatar billede eagleeye Praktikant
13. juni 2004 - 22:58 #25
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)
Avatar billede eagleeye Praktikant
13. juni 2004 - 23:02 #26
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)
Avatar billede eagleeye Praktikant
13. juni 2004 - 23:09 #27
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 & ")"
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 23:14 #28
Så tror jeg sgu den er der :-)
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 23:14 #29
13/06-2004 23:09:35 - gør vist arbejdet :-)
Avatar billede kimlarsen1978 Nybegynder
13. juni 2004 - 23:39 #30
Kan du ikke smide et svar til http://www.eksperten.dk/spm/508384 ?
Avatar billede eagleeye Praktikant
13. juni 2004 - 23:42 #31
Jo da :)
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

IT-JOB