---
title: "Slumpa olika poster"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/90208-slumpa-olika-poster"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "bigsky"
published: "2003-11-12T20:01:32.000Z"
updated: "2003-11-14T01:41:54.000Z"
replies: 20
views: 741
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/90208-slumpa-olika-poster"
---

# Slumpa olika poster

_Sida 1 av 2._

## #1 — bigsky, 2003-11-12T20:01Z

Sökte lite och hittade en del men ingen lösning som passade helt.

Jag vill slumpa fram tre olika poster's id från databasen för att sedan kunna skriva ut respektive fält för dessa. Det viktiga är att samma id får inte vara med i samma omgång så att säga.

Permalänk: https://www.webforum.nu/p/90208

## #2 — Jesper T, 2003-11-12T20:15Z

Har du MySql kan du skriva så här:

```
SELECT * FROM tabl ORDER BY RAND() LIMIT 3
```

Permalänk: https://www.webforum.nu/p/1204614

## #3 — bigsky, 2003-11-12T20:35Z

Nej tyvärr, det är Access som gäller.

Permalänk: https://www.webforum.nu/p/1204627

## #4 — Engine^, 2003-11-12T20:45Z

[Den som söker kan finna bara den orkar söka...](http://www.webforum.nu/showthread.php?s=&forumid=22&threadid=73584&highlight=slumpa+fram)

Det enda du behöver göra innan är att välja ut högsta och lägsta id:t från databasen och sedan slumpa fram tre unika id-nummer och göra en 

```
SELECT hmm FROM tabell WHERE id IN ([i]de tre slumparna[/i])
```

Permalänk: https://www.webforum.nu/p/1204634

## #5 — bigsky, 2003-11-12T21:10Z

Skulle man kunna få ett komplett exempel?

Permalänk: https://www.webforum.nu/p/1204654

## #6 — Sebbe, 2003-11-12T21:48Z

Typ såhär?

```
Dim arrID(0)
arrID(0) = "0"

intMax = objConn.Execute("SELECT Max(id) FROM [i]tabell[/i]")(0)

Do Until blnOK
  Randomize
  strSQL = "SELECT id FROM [i]tabell[/i] WHERE id = " & Int(Rnd() * intMax) + 1
  Set objRS = objConn.Execute(strSQL)

  If NOT objRS.EOF Then
    blnTemp = True

    For i = 0 To UBound(arrID)
      If CInt(arrID(i)) = objRS("id") Then blnTemp = False
    Next

    If blnTemp Then
      intCount = intCount + 1
      ReDim Preserve arrID(intCount)
      arrID(intCount) = objRS("id")
      strID = strID & objRS("id") & ","
    End If

    If intCount = 3 Then blnOK = True
  End If
Loop

strID = Left(strID, Len(strID) - 1)
strSQL = "SELECT * FROM [i]tabell[/i] WHERE id IN (" & strID & ")"
Set objRS = objConn.Execute(strSQL)
```

Fy vad jag är trött! Hoppas bara på att det inte finns fler än 20 fel i den där koden. ;)

**/red** 3 fel upptäckta och fixade. :p

Permalänk: https://www.webforum.nu/p/1204680

## #7 — Engine^, 2003-11-12T21:52Z

Hrrm... 

```
Private Sub RemoveFromArray(intValue, ByRef arrThis)
  Dim intIndex : intIndex = 0
  Dim blnFound : blnFound = False

  While Not blnFound
    intIndex = intIndex + 1
    If arrThis(i) = intValue Then blnFound = Not blnFound
  Wend

  For i = intIndex To UBound(arrThis)
    If Not i + 1 > UBound(arrThis) Then arrThis(i) = arrThis(i +1)
  Next

  ReDim Preserve arrThis(i - 1)
End Sub

Set objConn = Server.CreateObject("ADODB.Connection")
Set objRS = Server.CreateObject("ADODB.Recordset")

strSQL = "SELECT id FROM tabell"

objConn.Provider = "Microsoft.Jet.OleDb.4.0"
objConn.Open "Data Source=" & ...

objRS.Open strSQL, objConn, 1, 3

ReDim aintIDs(objRS.RecordCount + 1)
Dim i : i = 0

While Not objRS.EOF
  aintIDs(i) = objRS(0)

  objRS.MoveNext

  i = i + 1
Wend

objRS.Close
objConn.Close

Randomize

Dim aintRandom()
Dim intLeft : intLeft = 3
ReDim aintRandom(intLeft)

i = 0

While intLeft > 0 And UBond(aintIDs) > intLeft
  aintRandom(i) = aintIDs(Int(Rnd * UBound(aintIDs)))

  RemoveFromArray(aintRandom(i), aintIDs)

  i = i + 1
  intLeft = intLeft - 1
Wend

strSQL = "SELECT * FROM tabell WHERE id IN (" & Join(aintRandom, ",") & ")"
[blue]'Nu är det bara att välja ut posterna...[/blue]
```

Tro inte att den här koden fungerar rakt av för jag har skrivit den rätt upp och ner och skippat tester. Tänkte att du skulle få göra det ;)
Jag känner mig lite skeptisk till RemoveFromArray-funktionen, men det går att göra på andra sätt om man vill.

Du kan se det här som lågnivåpseudokod :)

Permalänk: https://www.webforum.nu/p/1204682

## #8 — bigsky, 2003-11-12T22:05Z

Sebbe, den klagar på raden: ReDim Preserve arrID(intCount)

> This array is fixed or temporarily locked

Permalänk: https://www.webforum.nu/p/1204687

## #9 — Engine^, 2003-11-12T22:19Z

Prova utan *Preserve*.

Permalänk: https://www.webforum.nu/p/1204695

## #10 — bigsky, 2003-11-12T22:23Z

No change.

Permalänk: https://www.webforum.nu/p/1204696

## #11 — Engine^, 2003-11-12T22:40Z

Då är det väl dags att tänka om då :)

```
Dim aintIDs(), aintPosts()
strSQL = "SELECT id FROM tabell"

objRS.Open strSQL, objConn, 1, 3

ReDim aintIDs(objRS.RecordCount)

i = 0

[blue]'Fyll en array med alla befintliga id-nummer[/blue]
While Not objRS.EOF
  aintIDs(i) = objRS(0)
  i = i +1

  objRS.MoveNext
Wend

objRS.Close

i = 0
intLeft = 3
intIndex = 0

ReDim aintPosts(intLeft)

[blue]'Välj ut intLeft nummer ur "listan" (förutsatt att listan är större än intLeft)[/blue]
While intLeft > 0 And UBound(arrIDs) > intLeft
  [blue]'Slumpa ut ett index i arrayen[/blue]
  intIndex = Int(Rnd * (UBound(arrIDs) - i)

  [blue]'Lagra id-numret som fanns på den platsen...[/blue]
  aintPosts(i) = arrIDs(intIndex)

  [blue]'Ta bort det valda id-numret och stoppa dit ett som inte är använt.
  'Ful metod, som jag inte är säker på att den stämmer...[/blue]
  aintIDs(intIndex) = aintPosts(UBound(arrIDs) - i)

  i = i + 1
  intLeft = intLeft - 1
Wend

Response.Write Join(aintPosts, ", ")
```

Vi kan ju stanna där och se om det fungerar...

Permalänk: https://www.webforum.nu/p/1204704

## #12 — bigsky, 2003-11-13T00:01Z

Ser ju ut att kunna funka, men hur skriver jag ut varje fält från databasen? Vart ska fältnamnen stå?

Permalänk: https://www.webforum.nu/p/1204744

## #13 — Engine^, 2003-11-13T00:19Z

Forstättningen...

```
strSQL = "SELECT * FROM tabell WHERE id IN ("& Join(aintPosts, ",") & ")"

objRS.Open strSQL, objConn, 1, 3

For Each fldTemp In objRS.Fields
  Response.Write fldTemp.Name & vbTab
Next

Response.Write "<br>"

While Not objRS.Eof
  For Each fldTemp In objRS.Fields
    Response.Write fldTemp.Value & vbTab
  Next

  Response.Write "<br>"

  objRS.MoveNext
Wend
```

Ett sätt... förmodligen inte som du vill ha det dock.

Permalänk: https://www.webforum.nu/p/1204748

## #14 — @nders, 2003-11-13T05:23Z

Om man vill kan man göra det lite enklare för sig, för man kan ju faktiskt slumpa direkt i SQL-frågan även med Access.

```
SELECT TOP 3 * FROM tabl ORDER BY RND(räknarfält)
```

Bör fungera i Access 97 och nyare.

Om man skulle vilja använda SQL Server kan man använda **NewId()** i sin ORDER BY istället.

mvh

Permalänk: https://www.webforum.nu/p/1204758

## #15 — Engine^, 2003-11-13T08:15Z

Det verkar ju vara alldeles för enkelt :)
Betydligt smärtfriare att göra på det sättet dock.

Permalänk: https://www.webforum.nu/p/1204790

## #16 — bigsky, 2003-11-13T14:20Z

Ja det hade ju varit suveränt. Men den slumpar ju inte alls. Det blir precis samma resultat som om man bara kör med TOP 3.

Permalänk: https://www.webforum.nu/p/1204957

## #17 — Jesper T, 2003-11-13T14:25Z

Kör du med RND() så måste du väl också sätta till "Randomize" före?: 

```
RANDOMIZE
SELECT TOP 3 * FROM tabl ORDER BY RND(räknarfält)
```

Permalänk: https://www.webforum.nu/p/1204964

## #18 — @nders, 2003-11-13T14:51Z

> **bigsky skrev:**
>
> Ja det hade ju varit suveränt. Men den slumpar ju inte alls. Det blir precis samma resultat som om man bara kör med TOP 3.

Konstigt. Jag fick jättefint resultat alla gånger jag testade. Vilken version av Access använder du?

Permalänk: https://www.webforum.nu/p/1204982

## #19 — Sebbe, 2003-11-13T16:54Z

> **bigsky skrev:**
>
> Sebbe, den klagar på raden: ReDim Preserve arrID(intCount)
> 
>
>
> > This array is fixed or temporarily locked

Nu är jag väl kanske lite sent ute, men det ska nog funka om du ändrar raderna

```
Dim arrID(0)
arrID(0) = "0"
```

till

```
Dim arrID()
ReDim arrID(0)
arrID(0) = "0"
```

Permalänk: https://www.webforum.nu/p/1205041

## #20 — bigsky, 2003-11-13T23:39Z

> **@nders skrev:**
>
> > **bigsky skrev:**
> >
> > Ja det hade ju varit suveränt. Men den slumpar ju inte alls. Det blir precis samma resultat som om man bara kör med TOP 3.
>
> Konstigt. Jag fick jättefint resultat alla gånger jag testade. Vilken version av Access använder du?

Kör med MS Office Access 2003.

Permalänk: https://www.webforum.nu/p/1205178

---

Tråden på webben: https://www.webforum.nu/amne/asp/90208-slumpa-olika-poster  
Nästa sida: https://www.webforum.nu/amne/asp/90208-slumpa-olika-poster/page2.md
