---
title: "Sortera efter variabel...?!?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/14271-sortera-efter-variabel"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "brw"
published: "2002-01-31T13:42:00.000Z"
updated: "2002-02-07T19:25:00.000Z"
replies: 7
views: 227
page: 1
pages: 1
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/14271-sortera-efter-variabel"
---

# Sortera efter variabel...?!?

## #1 — brw, 2002-01-31T13:42Z

Kan jag sortera efter ID enligt nedan och isf. hur?

SELECT \* FROM bilder WHERE ID in (6,8,5) ORDER BY ID (6,8,5) 

6,8,5 kommer från en variabel som har slumpats fram..

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

## #2 — SPiN, 2002-01-31T13:52Z

Om du plockar bort hela ORDER BY borde du få ut det i samma ordning som de står i, i IN-satsen. Annars förstår jag inte hur du menar?!

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

## #3 — brw, 2002-01-31T13:58Z

Nej.. det blir liksom inte i den ordningen... om jag tar bort ORDER BY... helmysko.. trodde den skulle ta det i den ordningen jag med..

kolla denna:

```
<%
Dim objConn, objRst, strSQL, strConnection, str, str1, cnt, cnt1, rndMax, RndNumber

maxnumber = 3
strSQL = "SELECT * FROM banner "
                            'objConn = connection
                            Set objRst = Server.CreateObject("ADODB.Recordset")
                            'Connection.Open strConnection
                            set objRst.ActiveConnection = Connection
                            objRst.LockType = adLockOptimistic
                            objRst.CursorType = adOpenKeySet
                            objRst.Open strSQL
                            objRst.MoveLast
                            cnt = objRst.RecordCount
                            cnt1 = cnt
                            rndMax = cnt
                            If cint(maxNumber) < cnt Then
                                cnt1 = cint(maxNumber)
                            End If
                            str = ","
                            str1 = ","

response.write "CNT: " & cnt & "<br>"
response.write "CNT1: " & cnt1 & "<br>"
response.write "rndmax: " & rndmax & "<br>"
response.write "maxnumber: " & maxnumber & "<br>"
response.write "str: " & str & "<br>"
response.write "str1: " & str1 & "<br>"

                                
                            Do Until cnt1 = 0
                            Randomize
                            RndNumber = Int(Rnd * rndMax)
                            If (InStr(1, str1, "," & RndNumber & "," ) = 0) Then
                                str1 = str1 & RndNumber & ","
                                cnt1 = cnt1 - 1
                                objRst.MoveFirst
                                objRst.Move RndNumber
                            str = str & objRst("id") & ","
                                End If
                            Loop
                            objRst.Close
                            Set objRst = Nothing
                            
                            If Right(str,1) = "," Then
                            	str = Left(str, len(str)-1)
                            End If	
                            
                            If Left(str,1) = "," Then
                            	str = Right(str, len(str)-1)
                            End If
                            
                            
                            sql = "SELECT * FROM banner WHERE ID in (" & str & ") "
                            'Set objRst = Server.CreateObject("ADODB.Recordset")
                            'set objRst.ActiveConnection = Connection
                            'objRst.LockType = adLockOptimistic
                            'objRst.CursorType = adOpenKeySet

response.write sql
Set objrst = Connection.Execute(sql)
                            'ObjRst.Open sql
                            %>

<% do until objRst.eof %>

<%=objRst("namn")%><br><%=objRst("width")%><br>
<% 
objRst.movenext
loop 
%>

                            <%
                            objRst.Close
                            Set objRst = Nothing
                            'objConn.Close
                            'Set objConn = Nothing
                            %>
```

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

## #4 — LarsG, 2002-01-31T14:13Z

SPiN Nej, om du inte har med order by vet du aldrig säkert i vilken ordning du får posterna. 

brw

Du får bygga upp din order by dynamiskt. Jag har inte tid att skriva hela koden nu men du får använda funktionen iif (du använder väl Access) enligt detta mönster

```
order by iif(id=6,1,iif(id=8,2,iif(id=5,3,100000)))
```

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

## #5 — brw, 2002-01-31T14:20Z

LarsG... du får gärna hjälpa mig med koden när du får tid över... den där funktionen vet jag inte riktigt hur jag ska få till enligt min kod...

Mycket tacksam för all hjälp :h

Red:
just nu kör jag SQL från jobbet.. men hemma Access så om det går att få den att fungera i båda så vore det bra.. det är ett bannerscript

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

## #6 — LarsG, 2002-01-31T19:05Z

Jag skrev om det lite ...

```
<%
Dim maxNumber,strSQL,connection,rs,cnt,rndNumber,i,found
set connection = server.createobject("adodb.connection")
connection.open "dsn"
maxnumber = 3

strSQL = "SELECT namn,width FROM banner "
set rs = connection.execute(strSQL)
if not rs.eof then
   arr = rs.getrows()
   items = ubound(arr,2) + 1
   if  items < maxNumber then maxNumber = items
dim choosen()
redim choosen(maxnumber-1)
   randomize
   cnt = 0
   Do Until cnt = maxnumber
      RndNumber = Int(Rnd * items)
      found = false
      for i = 0 to cnt - 1
          if  choosen(i) = rndNumber then
              found = true
              exit for
          end if
      next
      if  not found then
          choosen(cnt) = rndNumber 
          cnt = cnt + 1
          response.write arr(0,rndNumber) & "<br>" & arr(1,rndNumber) & "<br>"
      end if
   loop
else
   response.write "?"
end if

rs.Close
Set Rs = Nothing
connection.close
set connection = nothing
%>
```

Jag hämtar upp alla värdena till en array och plockar värdena direkt ur den istället för att ställa två frågor mot databasen. 

Om du skulle bygga en fråga med order by så skulle du behöva göra olika varianter för sql server och access. (I sql server fallet en case och iif för access).

Om du har väldigt mycket data så är det effektivare att hämta antalet rader med en 

```
select count(*) from banner
```

och sedan bygga sql-satsen, men som sagt du får du problem med olika dbms.

Det är ju inte speciellt testat (dvs inte alls), så du får återkomma om det är något problem.

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

## #7 — brw, 2002-02-06T06:36Z

Koden fungerar jävligt bra fast jag ångrar mig lite.. jag skulle bara vilja slumpa fram 1 av alla poster.. hur gör jag bäst då med koden jag fick av dig (LarsG)?

:h

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

## #8 — LarsG, 2002-02-07T19:25Z

Enklaste är att byta till

```
maxnumber=1
```

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

---

Tråden på webben: https://www.webforum.nu/amne/asp/14271-sortera-efter-variabel
