webForumDet fria alternativet

Sortera efter variabel...?!?

7 svar · 201 visningar · startad av brw

brwMedlem sedan juli 2000619 inlägg
#1

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..

------------------
Ingenting är omöjligt, bara en utmaning.

SPiNMedlem sedan mars 20007 896 inlägg
#2

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?!

------------------
SPiN, bjorne.w@telia.com

brwMedlem sedan juli 2000619 inlägg
#3

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
                            %>

------------------
Ingenting är omöjligt, bara en utmaning.

LarsGMedlem sedan dec. 200012 464 inlägg
#4

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)))

------------------
essentitia preter non sans multiplicandum

brwMedlem sedan juli 2000619 inlägg
#5

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

------------------
Ingenting är omöjligt, bara en utmaning.

[Redigerat av brw den 31 jan 2002]

LarsGMedlem sedan dec. 200012 464 inlägg
#6

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.

------------------
essentitia preter non sans multiplicandum

brwMedlem sedan juli 2000619 inlägg
#7

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

------------------
Ingenting är omöjligt, bara en utmaning.

[Redigerat av brw den 06 feb 2002]

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Enklaste är att byta till

maxnumber=1

------------------
essentitia preter non sans multiplicandum

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)