SkarreMedlem sedan apr. 20012 427 inlägg Jag använder följande kod för att hämta ett antal frågor ur en eller flera kategorier:
intNrQue = Request.Form("nrque")
strCategories = Request.Form("categories")
Set rsQue = Server.CreateObject("ADODB.RecordSet")
sqlQue = "SELECT TOP " & intNrQue & " * FROM tblQue INNER JOIN tblCat ON (tblQue.CatID = tblCat.CatID) WHERE tblCat.CatID IN (" & strCategories & ") ORDER BY QID"
rsQue.Open sqlQue, objConn, 1, 1, 1
Jag vet inte hur SQL-satsen väljer frågorna, men jag skulle vilja visa ungefär lika många frågor ur varje kategori. Någon som vet hur det skulle kunna gå till?
------------------
// Skarre
LarsGMedlem sedan dec. 200012 464 inlägg TOP är alltid kopplat till de kolumner som finns med i order by. Så i ditt fall får du poster som har lägst QID.
categories = split(strCategories,",")
items = ubound(categories) + 1
top = cint(items/intNrQue)
sqlQue = ""
for i = 0 to ubound(categories)
if i > 0 then
sqlQue = sqlQue & "union all "
sqlQue = sqlQue & "SELECT TOP " & top & " * FROM tblQue INNER JOIN tblCat ON (tblQue.CatID = tblCat.CatID) WHERE tblCat.CatID = " & categories(i)
& " ORDER BY QID "
next
rsQue.Open sqlQue, objConn, 1, 1, 1
om intNrQue = 10 och du har 5 kategorier så får du 2 från varje.
Det går att skriva en generell select utan union men jag tror att den frågan blir långsammare, i alla fall om du har få kategorier.
------------------
essentitia preter non sans multiplicandum
SkarreMedlem sedan apr. 20012 427 inlägg Eftersom det kommer från dig Lars, så fungerar det säkerligen, men jag vill inte använda kod som jag inte förstår så jag undrar om du eller någon annan skulle kunna förklara "UBound" för mig.
I VBScript referensen står: "Returns the largest available subscript for the indicated dimension of an array.". Och jag måste erkänna att jag inte blir så mycket klokare av det.
------------------
// Skarre
@ndersMedlem sedan juni 200032 969 inlägg Ubound är det högsta tillgängliga index (plats) i din array.
Är ubound 5 så finns inte plats 6, och du kan då heller inte använda den, och därmed ska du inte heller loopa förbi 5.
Mvh,
------------------
Don't panic!
LarsGMedlem sedan dec. 200012 464 inlägg Om man använder funktionen split så får man en array som resultat. För att få reda på hur många element det finns i arrayen så kan man använda ubound. Då det första indexet i en array är 0 så blir antalet element 1 mer.
Jag kan ta ett exempel
dim a(12)
x = ubound(a)
'värdet av x är 12 men arrayen har
'plats för 13 element
dim b(12,10)
x = ubound(b) 'samma som ubound(b,1)
'x = 12 första dimensionen
y = ubound(b,2)
'y = 10 andra dimensionen
------------------
essentitia preter non sans multiplicandum
SkarreMedlem sedan apr. 20012 427 inlägg O.K. då är det lite klarare. Det vill dock inte fungera riktigt för mig när jag använder din kod, Lars.
Error Type:
Microsoft JET Database Engine (0x80040E14)
Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.
Så här ser SQL-satsen ut när jag valt 15 frågor och tre kategorier:
UNION ALL SELECT TOP 5 * FROM tblQue INNER JOIN tblCat ON (tblQue.CatID = tblCat.CatID) WHERE tblCat.CatID = 2 ORDER BY QID UNION ALL SELECT TOP 5 * FROM tblQue INNER JOIN tblCat ON (tblQue.CatID = tblCat.CatID) WHERE tblCat.CatID = 3 ORDER BY QID
Jag har aldrig hört talas om UNION ALL förut så jag vet inte riktigt vad som kan vara fel.
------------------
// Skarre
LarsGMedlem sedan dec. 200012 464 inlägg Du kan inte ha tagit min kod rätt av (för det finns ett fel i den)
categories = split(strCategories,",")
items = ubound(categories) + 1
top = cint(items/intNrQue)
sqlQue = ""
for i = 0 to ubound(categories)
[red]
if i > 0 then
sqlQue = sqlQue & "union all "
[b]end if[/b][/red]
sqlQue = sqlQue & "SELECT TOP " & top & " * FROM tblQue INNER JOIN tblCat ON (tblQue.CatID = tblCat.CatID) WHERE tblCat.CatID = " & categories(i)
& " ORDER BY QID "
next
rsQue.Open sqlQue, objConn, 1, 1, 1
------------------
essentitia preter non sans multiplicandum
SkarreMedlem sedan apr. 20012 427 inlägg Nej, inte rätt av. Jag var tvungen att anpassa den lite och hittade felet med "end if". Jag var även tvungen att vända på värdena i "(intItems / intNrQue )". För enkelhetens skull har jag klistrat in hela prylen nedan:
intNrQue = Request.Form("nrque")
strCategories = Request.Form("categories")
Set rsQue = Server.CreateObject("ADODB.RecordSet")
strSplitCat = Split(strCategories,",")
intItems = UBound(strSplitCat) + 1
intTop = CInt(intNrQue / intItems)
sqlQue = ""
For i = 0 To UBound(strSplitCat)
If i > 0 Then
sqlQue = sqlQue & "UNION ALL "
sqlQue = sqlQue & "SELECT TOP " & intTop & " * FROM tblQue INNER JOIN tblCat ON (tblQue.CatID = tblCat.CatID) WHERE tblQue.CatID = " & strSplitCat(i) & " ORDER BY QID "
End If
Next
Response.Write sqlQue
rsQue.Open sqlQue, objConn, 1, 1, 1
------------------
// Skarre
[Redigerat av Skarre den 07 dec 2001]
LarsGMedlem sedan dec. 200012 464 inlägg Om du flyttar upp end if så borde det bli bättre
intNrQue = Request.Form("nrque")
strCategories = Request.Form("categories")
Set rsQue = Server.CreateObject("ADODB.RecordSet")
strSplitCat = Split(strCategories,",")
intItems = UBound(strSplitCat) + 1
intTop = CInt(intNrQue / intItems)
sqlQue = ""
For i = 0 To UBound(strSplitCat)
If i > 0 Then
sqlQue = sqlQue & "UNION ALL "
[b]end if[/b]
sqlQue = sqlQue & "SELECT TOP " & intTop & " * FROM tblQue INNER JOIN tblCat ON (tblQue.CatID = tblCat.CatID) WHERE tblQue.CatID = " & strSplitCat(i) & " ORDER BY QID "
Next
Response.Write sqlQue
rsQue.Open sqlQue, objConn, 1, 1, 1
Union innebär att man lägger ihop resultatet av flera olika select-satser. Om skriver union all så innebär det att man inte tar bort duplikat från slutresultatet.
------------------
essentitia preter non sans multiplicandum
SkarreMedlem sedan apr. 20012 427 inlägg Tackar tackar, det funkar perfekt. Och nu till det jag egentligen ville komma till när jag skrev rubriken till denna tråd. Går det att på ett enkelt vis se till att frågorna slumpmässigt väljs? Jag såg i en tråd intill att man kunde skapa en funktion för detta, men det såg ganska rörigt ut och jag vågar nästan inte mucka med min sql-sats ytterligare. :-) Finns det inget enklare sätt?
------------------
// Skarre