Kan man skriva själva Random-kommandot direkt i SQL-satsen?
Nej, om man använder Access fungerar det av någon anledning inte.
8 svar · 350 visningar · startad av zlakker
Jag har sökt och det finns ett antal kod-snuttar som slumpar ut olika rader från en databas.
Jag vill på ett enkelt sätt hämta ut endast EN slumpad rad ur databasen och hämta ett värde.
Kan man skriva själva Random-kommandot direkt i SQL-satsen?
Sedan kan jag lägga värdet i en recordset och skriva ut det och tex när man går in på sidan nästa gång så borde ett annat värde slumpas fram.
Jag använder mig av en access-databas.
Kan man skriva själva Random-kommandot direkt i SQL-satsen?
Nej, om man använder Access fungerar det av någon anledning inte.
Vad tråkigt
Finns det någon enklar kod för det eller måste man ha ett helt A4 typ :)
Man kan slumpa poster från en Access-databas på detta sätt:
strSQL = "SELECT TOP 1 fält FROM tabell ORDER BY Rnd(-Id-" & Replace(Rnd(),",",".") & ")"
Tack för tipse men det plockar bara den första posten i databasen hela tiden.
Har du fåttt det att fungera?
Lägg till Randomize på raden över.
Denna kod skrev @nders till mig när jag skrev en liknande fråga.
Dim vIDs()
' Här bestämmer vi hur många recept vi vill slumpa fram.
iAntalRecept = 3
Redim vIDs(iAntalRecept)
set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open MM_news_STRING
sSQL = "SELECT Receptnr, rec_namn1 FROM Recept"
set objRS = objConn.Execute (sSQL)
vRecept = objRS.GetRows()
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
' Kalla på slumpfunktionen!
RandomizeIt vRecept, vIDs, 0, iAntalRecept
' Och nu är det dags att skriva ut resultaten!
for i = 0 to ubound(vIDs) -1
sReceptNummer = vRecept(0, vIDs(i))
sReceptNamn = vRecept(1, vIDs(i))
' Index 0 och 1 ovan hänvisar alltså till det första resp. andra fältet i recordsetet (enl. ordningen i SQL-frågan).
' Lägger du till fler fält, är det bara att plussa på.
Response.Write sReceptnummer & " - " & sReceptnamn & "<br>"
next
Sub RandomizeIt(ByVal vRows, ByRef vContainer, ByRef iCounter, ByVal iRecords)
sTmpTest = "|" & join(vContainer, "|") & "|"
Randomize
iTmp = Int ((ubound(vRows, 2) + 1) * rnd)
if instr(sTmpTest, "|" & vRows(0, iTmp) & "|") = 0 then
' Den hade vi inte tidigare slumpat fram. Den tar vi!
vContainer(iCounter) = iTmp
iCounter = iCounter + 1
end if
if iCounter < iRecords then
' Vi ska hämta fler! Kalla på funktionen igen.
RandomizeIt vRows, vContainer, iCounter, iRecords
end if
End Sub
Den förutsätter att du har en räknare. Ändra i SQLen så att den stämmer med din tabell och ändra antalet rader du vill skriva ut samt objConn.Open så det stämmer för din sökväg, då borde den fungera för dig.
Det som är märkligt med Access är att det går alldeles utmärkt att köra en enkel fråga med order by rnd(id) i själva programmet, och man får en fungerande slumpning. Om man ansluter på annat vis, exempelvis från en ASP-sida med OLEDB, så fungerar inte slumpningen, och man får samma post vid varje exekvering. I MySQL och Microsoft SQL Server fungerar det dock fint.
Mvh
Det funkar!
Tack patflat och Josef. Om man kombinerade era två fungerar det.
Har testat att uppdatera sidan 1000000 grr och det funkar varje gång. Eller kan det finnas någon möjlighet till fel?
<%
Randomize
SQL = "SELECT TOP 1 * FROM tblRandom ORDER BY Rnd(-Id-" & Replace(Rnd(),",",".") & ")"
Set RecSet = GetRecordset(SQL)
%>
<img src="upload/<%=RecSet("bildurl")%>">