Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Välja ut poster ur db med Randomize

Postades av 2003-03-09 23:26:51 - Magnus Åkermark, i forum asp - allmänt, Tråden har 13 Kommentarer och lästs av 825 personer

Jag ska välja 4 stycken poster ur db slumpmässigt. Detta får jag att fungera bra , men hur gör man om man vill undvika att samma post visas två gånger? För det är väl troligt att samma post kan slumpas fram flera gånger?


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 07:49:20 - Jonas Sjöblom

har du nån kod att visa?
testa sätt till

group by id

i din SQL


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 07:50:23 - Jonas Sjöblom

eller kom på att det nog inte är så bra ide...

tror det finns nått som heter distinct som du kan använda


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 12:49:44 - Johan Djupmarker

Hur slumpar du nu? Du kan ju använda TOP/LIMIT för att plocka ut alla fyra posterna samtidigt, då kommer du inte få samma post flera gånger.

/Johan


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 12:51:18 - Magnus Åkermark

Här kommer koden jag använder nu.......


//Först räknar jag antalet poster i mitt recordset:

<%
antal_poster = 0
do until RS.EOF
antal_poster = antal_poster + 1
RS.Movenext
Loop
RS.Movefirst

//Så här ser själva koden ut för att välja ut 4 stycken poster slumpmässigt:


for n = 1 to 4
randomize
post = Int((RND * antal_poster) + 1)
RS.Movefirst
RS.Move post
%>

<td>Här skrivs varje post ut</td>

<%next%>


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 14:36:14 - Johan Printz

Hej

order by rand() limit XX ger slumpmässigt resultat, dvs du kan få dubletter.

Jag rekommenderar dig att använda rand() limit 1 och loopa tills önskat antal
returnerats. Vid varje loop kolla, mot en resultat array, att resultatet är unikt, är det inte det skippa o loopa igen.

Mvh
Johan


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 14:58:59 - Magnus Åkermark

Så jag kan altså slumpa fram posterna direkt i SQL-satsen?

då kan jag väl skriva :

select TOP 4 from tabell where ...... order by rand() ??


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 15:20:56 - Johan Printz

Hej

randomize
select * from tabell order by rand() limit 10

ger 10 slumpmässiga rader men det kan vara dubletter i denna resultattabell.

det är därför du måste, som jag ser det, begränsa din slumpmässiga utsortering till 1, limit 1, och sedan kontrollera resultatet mot en array som du skapar..

undrar hur det skulle bli med

select distinct(*) from tabell order by rand() limit 20? Antaligen skulle du inte få en resultatabell med 20 då... eftersom distinct sorterar bort dessa.. inge bra det heller men kanske värt att testa.

Mvh
Johan


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 15:53:41 - Christoffer Hedgate

OK, till att börja med så antar jag att det är MySQL vi pratar om här eftersom LIMIT inte finns i så många andra produkter. Dock används nyckelordet TOP i något inlägg högre upp, så jag undrar om det verkligen är MySQL frågan här gäller?

Sedan så undrar jag om det du skriver verkligen stämmer, vilket isf innebär att det är MySQL som återigen beter sig mycket konstigt.

> randomize
> select * from tabell order by rand() limit 10
> ger 10 slumpmässiga rader men det kan vara dubletter i denna resultattabell.

Eftersom SQL är ett mängdbaserat språk ska egentligen alla rader få samma värde från rand()-funktionen (eftersom den ska endast köras en gång för hela mängden), men förmodligen är den funktionen speciellt kodad till att inte göra det utan istället köras en gång för varje rad. Funktionen newid() i SQL Server (skapar en ny UUID (GUID)) fungerar likadant, den körs alltid en gång för varje rad. Därför kan man i SQL Server skriva SELECT TOP 10 * FROM FOOBAR ORDER BY NEWID() och få en slumpmässig sortering. Observera dock att det innebär att newid() måste köras en gång för varje rad i tabellen, och har man en stor tabell så kan det ta mycket tid och resurser.

Varför kan det bli dubletter i ditt exempel? Varje rad får ett värde från rand() (även om alla raderna får samma värde gör det ingen skillnad), och därefter returneras de 10 rader som fick de lägsta värdena. Det ska aldrig kunna göra att vissa rader returneras flera gånger?!

> select distinct(*) from tabell order by rand() limit 20? Antaligen skulle du inte få en resultatabell med 20 då... eftersom distinct sorterar bort dessa.. inge bra det heller men kanske värt att testa.

DISTINCT plockar bort dubletter i resultatet, men det måste väl ändå ske innan sortering? Alltså bör man fortfarande få 20 rader, i slumpmässig ordning (om inte rand() ger samma värde för alla rader).


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 17:13:34 - Johan Printz

Hej

jag har testat lite grann, resultattabellen blir det angivna antalet och det ser inte ut som det blir dubletter.

Bra funktion.

Men, det kanske är MySQL unikt så det kanske inte hjälper frågeställaren som jag uttryckte mig men det kanske går att omformulera frågan så den passar andra miljöer.

Med vänlig hälsning
Johan


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 17:55:20 - Magnus Åkermark

Jag använder en access DB.

Då kan man inte använda rand() ?


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-10 19:09:43 - Johan Djupmarker

RND(unikt fält) har jag för mig fungerar.

/Johan


Svara

Sv: Välja ut poster ur db med Randomize

Postades av 2003-03-11 15:10:56 - Patrik Berggren

En lösning som funkar på alla "dbms":

<%
Option Explicit

Dim objConn
Dim strSQLrnd
Dim rstRnd
Dim varyRecs
Dim varyRnd
Dim N

'## -- 3 fält namngivna i sql-frågan kommer att ge 3 positioner i arrayen
'## eftersom vi kommer att hämta vår data med .GetRows och få en
'## 2-dimensionell array tillbaka
strSQLrnd = "SELECT Field1, Field2, Field3 FROM MyTable"

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "MyConnString"
Set rstRnd = objConn.Execute(strSQLrnd)
If Not rstRnd.EOF Then
'## -- fetch array --
varyRecs = rstRnd.GetRows(-1)
End If
Set rstRnd = Nothing
objConn.Close
Set objConn = Nothing

'## -- random posts from array --
'## varyRecs som argument för arrayen
'## 5 för antal "poster" som vi vill ha slumpat
'## 3 för antal positioner för varje index i arrayen (3 fält i sql-frågan)
varyRnd = Random(varyRecs, 5,3)

'## -- kontrollera att vi fått tillbaka några poster
If IsArray(varyRnd) Then
For N = 0 TO UBound(varyRnd,2)
Response.Write "ID: " & varyRnd(0,N) & " Data: " & varyRnd(1,N) & "<br>"
Next ' N
End If

'## -- get iRnd random values from array --
'## argument: vArray a 2-dimensional array
'## argument: iRnd how many random posts we need
'## argument: intPost how many posts for each index in the 2-dimensional array
Public Function Random(ByVal vArray, ByVal iRnd, intPos)
If Not IsArray(vArray) Then Exit Function
If Not IsNumeric(iRnd) OR Not IsNumeric(intPos) Then Exit Function

Randomize

Dim varArray
Dim intMaxIndex
Dim intRandomIndex
Dim N
Dim X

intPos = intPos - 1
'## -- how many indexes in the array --
intMaxIndex = UBound(vArray,2)
'## -- kontrollera så att vi inte väljer att få ut fler
'## slumpade poster än det finns poster (index) i arrayen --
If iRnd > intMaxIndex Then iRnd = intMaxIndex

ReDim varArray(intPos, iRnd - 1)

'## -- get iRnd random values from array --
For N = 0 To iRnd - 1
'## -- get random index values from "mother" array --
intRandomIndex = CInt(rnd * (intMaxIndex - N))

'## -- save random data --
For X = 0 TO intPos
varArray(X, N) = vArray(X,intRandomIndex)

vArray(X, intRandomIndex) = vArray(X,intMaxIndex - N)
Next
Next

'## -- return an array of iRnd random selected from "mother" array --
Random = varArray
End Function
%>

Lite jobbig blir den när det finns många poster i db ..... 1000 eller fler ;o)

redigerat:
OBS! kanske inte buggfri då jag klippte ut koden. Ingår i en del av mina komponenter, fast då med random för vanliga arrayer oxå.
/redigerat

cya,
PatrikB


Svara

Nyligen

  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 808
27 960
271 761
521
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies