Avatar billede vb-mo Nybegynder
28. marts 2003 - 11:54 Der er 16 kommentarer og
3 løsninger

Random udtræk fra database ?!?

Hejsa

Jeg har været ved at lede efter oplysninger om hvorledes man kan lave et random udtræk fra databasen således at der vises f.eks. forskellige produkter på en forside for hver gang men besøger siden. Er der en her der kan komme med nogle ideer til hvordan jeg kan gøre dette ?

/vb-mo
Avatar billede Slettet bruger
28. marts 2003 - 12:02 #2
<%
set rs = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT * FROM DinTabel"
rs.Open SQL, Conn, 1

randomize
rs.Move(int(rs.RecordCount * rnd))
%>

<%=rs("DinRecord")%>

måske ? ellers så er der den fine søgefunktion som medions svarede med
Avatar billede medions Nybegynder
28. marts 2003 - 12:12 #3
Well, det kunne jo oxo gøres sådan her:

Forudset du har en tabel der hedder tblNavne og i den har du kolonnerne id og navne

<%
    Function RandomRs(intInterval)
        Randomize
        lngTal = CInt(Rnd() * intInterval)
       
        If lngTal = 0 Then
            RandomRs = lngTal + 1
        Else
            RandomRs = lngTal
        End If
    End Function
   
    Set objConn = Server.CreateObject("ADODB.Connection")
   
    objConn.Open "Driver={MicroSoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("db1.mdb")
   
    strSQL = "SELECT COUNT(*) FROM tblNavne"
    Set objRsCount = objConn.Execute(strSQL)
   
    Randomize
   
    strSQL = "SELECT * FROM tblNavne WHERE id = " & RandomRs(objRsCount(0))
    Set objRs = objConn.Execute(strSQL)
   
    Response.Write(objRs("Navne"))
%>

//>Rune
Avatar billede dk_akj Nybegynder
28. marts 2003 - 12:27 #4
<%

Set rs_id = conn.execute ("select id from tabelnavn")

myarray = rs_id.getrows()

myMax = ubound(myarray,2)

response.write "rækker ialt = " & myMax & "<br>"


Randomize  'ryst posen
myrow = Int((mymax * Rnd) + 1)  'find tilfældig række
response.write "tilfældig række = " & myrow & "<br>"

id = myarray(0,myrow)

set rs = conn.execute ("select felt1,felt2 from tabelnavn where id = " & id)

response.write rs("felt1")

%>

//akj
Avatar billede vb-mo Nybegynder
28. marts 2003 - 13:05 #5
Ok så er der lidt at arbejde med :o) Jeg er lidt usikekr på den randomize, skal den ikke stoppes efter endt brug eller er det lige meget ?
Avatar billede medions Nybegynder
28. marts 2003 - 13:11 #6
Det er lige meget... Den randomizer bare dit dokument når det er loaded.. det er fintfint :)

//>Rune
Avatar billede _darkstar_ Nybegynder
28. marts 2003 - 13:14 #7
Hej venner,

Alle de ovenstående tilfældig-række-funktioner, som I foreslår har faktisk nogle heftige performance-problemer. Hvis det skal køre rigtig hurtigt, er det vigtigt at undgå at læse mere end den ene, tilfældige række, som man skal bruge (eller så få som muligt).
Avatar billede dk_akj Nybegynder
28. marts 2003 - 13:17 #8
darkstar >> og din løsning på problemmet er ....

//akj
Avatar billede vb-mo Nybegynder
28. marts 2003 - 13:21 #9
Ok så langt så godt det virker fint :o) Men hvis jeg så vil lave det således at jeg har en tabel med 2 rækker og 2 kolonner hvor tekst og billed vises modsat på 2 random udtræk er der så oxo en lille finte man kan lave der ?
Avatar billede medions Nybegynder
28. marts 2003 - 13:23 #10
Hmm den forstår jeg ikke helt.. prøv lgie at beskrive den igen...

//>Rune
Avatar billede vb-mo Nybegynder
28. marts 2003 - 13:29 #11
Altså 2 kolonner og 2 rækker i en tabel den er du sikkert med på så prøver jeg lige at tegne det for dig :

                  Kolonne 1                  Kolonne 2


Række 1          billed her                tekst her




Række 2          tekst her                billed her

Var det bedre ?
Avatar billede medions Nybegynder
28. marts 2003 - 13:31 #12
!"#¤%&/
Det er hvordan du vil ha' dit randomudtræk jeg er i tvivl om!

//>Rune
Avatar billede dk_akj Nybegynder
28. marts 2003 - 13:32 #13
Der er ikke meget at lave random på ;-)

Hvi der altid er 2 og kun 2 kan du jo lave det med en "if"

if tilfældigrække1 = 1 then
tilfældigrække2 = 2
else
tilfældigrække2 = 1
end if

//akj
Avatar billede vb-mo Nybegynder
28. marts 2003 - 13:38 #14
ok jeg prøver igen hvergang siden loades skal der random hentes 2 udtræk fra databasen og de to udtræk skal så ligge forskudt i tabellen som vist oven for.
Avatar billede dk_akj Nybegynder
28. marts 2003 - 13:41 #15
<%

Set rs_id = conn.execute ("select id from tabelnavn")

myarray = rs_id.getrows()

myMax = ubound(myarray,2)


Randomize  'ryst posen
myrow = Int((mymax * Rnd) + 1)  'find tilfældig række

id = myarray(0,myrow)

set rs = conn.execute ("select id, felt1,felt2 from tabelnavn where id = " & id)

response.write rs("felt1") & " " & rs("felt2")




Set rs_id = conn.execute ("select id from tabelnavn where id <> " & rs("id"))

myarray = rs_id.getrows()

myMax = ubound(myarray,2)


Randomize  'ryst posen
myrow = Int((mymax * Rnd) + 1)  'find tilfældig række

id = myarray(0,myrow)

set rs = conn.execute ("select felt1,felt2 from tabelnavn where id = " & id)

response.write rs("felt2") & " " & rs("felt1")


%>

//akj
Avatar billede _darkstar_ Nybegynder
28. marts 2003 - 13:59 #16
dk_akj>>> Jeg skrev ikke noget fordi at jeg ikke umiddelbart kunne komme på en rigtig god løsning, men her er da en:

size = 1000
sample = size / 10
Randomize
rseed = Int(Rnd * 1000000)
rselect = Int(Rnd * sample)

set rs = conn.execute ("SELECT TOP 1 * FROM mintabel WHERE " & rselect & "= ((" & rseed & " * (" & sample & " + 17)) mod (" & sample & " - 3)")

Den benytter SQL til at vælge en tilfældig række. Desværre vil flere rækker opfylde kriteriet, hvorefter at man får databasen til at smide alle pånær den første væk. rsize skal sættes til et tal som svarer nogenlunde til antallet af rækker i databasen (det må dog gerne afvige en del - performance falder blot i takt med at tallet afviger).

De løsninger hvor man henter alle id'er er rigtigt dårlige, da systemet vil få elendig performance når der er mange rækker. Den næst-værste løsning (som kan blive det, man bliver nødt til at gøre) er at bruge min løsning ovenfor, hvor size sættes til det reelle antal rækker i tabellen via en forespørgsel. Det burde køre væsentligt hurtigere.

Iøvrigt har jeg ikke testet koden ovenfor. Der skal nok tweakes lidt på parametrene. Det er vigtigt at de to tal ((rseed * ( sample + 17)) og sample - 3 i flest mulige tilfælde har 1 som største fælles divisor. Ellers bliver udvælgelsen ikke så tilfældig. Derfor de to tal 17 og 3.
Avatar billede vb-mo Nybegynder
28. marts 2003 - 14:49 #17
Ok jeg vil kigge på det hele når jeg kommer tilbage til min pc igen senere :o)
Avatar billede _darkstar_ Nybegynder
28. marts 2003 - 17:23 #18
Et lille p.s.: hvis man er rigtigt uheldig, vil min kode ikke resultere nogen rækker overhovedet, men det burde ske meget sjælent. I så fald kan man bare køre den igen.
Avatar billede medions Nybegynder
24. april 2003 - 13:42 #19
Lukketid?

//>Rune
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