webForumDet fria alternativet

Plocka ut endast EN valfri rad i databas

ASP

8 svar · 350 visningar · startad av zlakker

Medlem sedan apr. 2001227 inlägg
Frågan#1

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.

Medlem sedan juni 200032 967 inlägg
#2

Kan man skriva själva Random-kommandot direkt i SQL-satsen?

Nej, om man använder Access fungerar det av någon anledning inte.

Medlem sedan apr. 2001227 inlägg
#3

Vad tråkigt
Finns det någon enklar kod för det eller måste man ha ett helt A4 typ :)

Medlem sedan sep. 200421 inlägg
#4

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(),",",".") & ")"
Medlem sedan apr. 2001227 inlägg
#5

Tack för tipse men det plockar bara den första posten i databasen hela tiden.
Har du fåttt det att fungera?

Medlem sedan mars 20023 561 inlägg
#6

Lägg till Randomize på raden över.

Medlem sedan feb. 2005216 inlägg
#7

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.

Medlem sedan juni 200032 967 inlägg
#8

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

Medlem sedan apr. 2001227 inlägg
#9

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")%>">
254 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)