Avatar billede showoff Nybegynder
12. april 2007 - 09:27 Der er 42 kommentarer og
1 løsning

Udvælgelse af specifkke data

Hej

Jeg er ved at lave et quizsystem, hvor alle spørgsmål ligger i  en database. Spørgsmålene er inddelt 3 katagorier men de ligger alle i samme tabel. Nu vil jeg så gerne udtrække 5 tilfældige spørgsmål fra hver katagori. Nu er spørgsmålet så om dette kan gøres i en sql sætning eller jeg skal trække dem ud 5 ad gangen?

Har indtil videre dette stump kode som udtrækker 5 tilfældige i en katagori

randomize
R=clng(100000*rnd)

oRS.Open "SELECT TOP 5 * FROM sprg WHERE (cat= '1') ORDER BY rnd(-(ID)*" & R & ")"
Avatar billede terry Ekspert
12. april 2007 - 09:47 #1
Make a UNION SELECT

SELECT .... WHERE cat= '1' ...
UNION
SELECT .... WHERE cat= '2' ...
UNION
SELECT .... WHERE cat= '3' ...
Avatar billede terry Ekspert
12. april 2007 - 09:48 #2
Make a query and then use the query in your recordset

oRS.OPen "SELECT * FROM yourQuery ...."
Avatar billede showoff Nybegynder
12. april 2007 - 10:01 #3
hmm skal det forståes som to forskellige løsningsforslag? Den første forstår jeg muligvis - vil koden så se sådan her ud

oRS.Open "SELECT TOP 5 * FROM sprg WHERE (cat= 1) ORDER BY rnd(-(ID)*" & R & ") UNION SELECT TOP 5 * FROM sprg WHERE (cat= 2) ORDER BY rnd(-(ID)*" & R & ") UNION SELECT TOP 5 * FROM sprg WHERE (cat= 3) ORDER BY rnd(-(ID)*" & R & ")"
Avatar billede terry Ekspert
12. april 2007 - 10:13 #4
No its only one solution.

What is the R for in the SQL? >>> )*" & R & ")

If its a variable then you will need to build the SQL in code as you did in your example 12/04-2007 10:01:02. Then forget about the query I mentioned 12/04-2007 09:48:48.

...vil koden så se sådan her ud

Yes, but I dont know if it is 100% correct, so I cant say if it will work as it is.
Avatar billede showoff Nybegynder
12. april 2007 - 10:31 #5
Ja det er en variabel
randomize
R=clng(100000*rnd)

Som bruges til at sortere dataen tilfældigt. Der er måske en bedre måde?
Avatar billede terry Ekspert
12. april 2007 - 10:51 #6
Here's something which may work, you'll need to modify it slightly
http://www.mvps.org/access/queries/qry0011.htm
Avatar billede showoff Nybegynder
12. april 2007 - 13:21 #7
Ok, jeg vil teste det og så vende tilbage til dig
Avatar billede jensen363 Forsker
16. april 2007 - 11:03 #8
Alternativ : Eksempel på Tilfældig TOP3

SELECT TOP 3 Tabel.Spørgsmål, Tabel.SpørgsmålID, Tabel.Valgt
FROM Tabel
WHERE (((Tabel.Valgt)=False) AND ((randomizer())=0))
ORDER BY Rnd(IsNull(Tabel.SpørgsmålID)*0+1);
Avatar billede showoff Nybegynder
17. april 2007 - 09:38 #9
HEj Terry, hmm lader ikke rigtig til at virke, jeg kan godt vælge dem ud men ikke få lov til at udvælge dem tilfældligt hver især. Får denne fejl.

[Microsoft][ODBC Microsoft Access Driver] The ORDER BY expression (rnd(-ID*97015)) includes fields that are not selected by the query. Only those fields requested in the first query can be included in an ORDER BY expression.

Til Jensen, så er jeg ikke helt sikker på du har forstået spørgsmålet, da jeg ikke kun vil lave et udtræk og sortere, men 3 forskellige udtræk og sortere
Avatar billede showoff Nybegynder
17. april 2007 - 09:41 #10
Hvis jeg skriver koden sådan her virker det

oRS.Open "SELECT TOP 5 * FROM sprg WHERE (cat= 1) ORDER BY rnd(-(ID)*" & R & ") UNION SELECT TOP 5 * FROM sprg WHERE (cat= 2)UNION SELECT TOP 5 * FROM sprg WHERE (cat= 3)"

Altså uden order på de sidste to udtræk..........men det er bare ikke godt nok da disse jo også skal sorteres tilfældigt
Avatar billede jensen363 Forsker
17. april 2007 - 09:51 #11
Ikke testet

SELECT TOP 5 Tabel.Spørgsmål, Tabel.cat
FROM Tabel
WHERE (((Tabel.Cat)=1) AND ((randomizer())=0))
ORDER BY Rnd(IsNull(Tabel.Spørgsmål)*0+1)
UNION
SELECT TOP 5 Tabel.Spørgsmål, Tabel.cat
FROM Tabel
WHERE (((Tabel.Cat)=2) AND ((randomizer())=0))
ORDER BY Rnd(IsNull(Tabel.Spørgsmål)*0+1)
UNION
SELECT TOP 5 Tabel.Spørgsmål, Tabel.cat
FROM Tabel
WHERE (((Tabel.Cat)=3) AND ((randomizer())=0))
ORDER BY Rnd(IsNull(Tabel.Spørgsmål)*0+1)
Avatar billede jensen363 Forsker
17. april 2007 - 10:01 #12
Kræver lige, at denne funktion er med :-)

Function Randomizer() As Integer
Static AlreadyDone As Integer
        If AlreadyDone = False Then Randomize: AlreadyDone = True
    Randomizer = 0
End Function
Avatar billede showoff Nybegynder
17. april 2007 - 10:04 #13
tak, Jeg går ud fra at "Tabel.cat" er navnet på min tabel og kolonne ik? men hvorfor kan jeg ikke bare vælge *? Nu har jeg prøvet din kode men får denne fejl

[Microsoft][ODBC Microsoft Access Driver] Undefined function 'randomizer' in expression.
Avatar billede jensen363 Forsker
17. april 2007 - 10:04 #14
Virker desværre ikke med UNION, men så skal du benytte 3 udtræk ( een for hver cat )
Avatar billede jensen363 Forsker
17. april 2007 - 10:09 #15
[Microsoft][ODBC Microsoft Access Driver] Undefined function 'randomizer' in expression

Eer fordi du lige skal have funktionen nævnt 17/04-2007 10:01:58 med
Avatar billede showoff Nybegynder
17. april 2007 - 10:13 #16
Nu får jeg ny fejl i din funktion

Function Randomizer() As Integer
----------------------^
Avatar billede showoff Nybegynder
17. april 2007 - 10:16 #17
Ok, jeg kan godt lave 3 udtræk, men hvordan får jeg dem så smartest slået sammen til sidst?
Avatar billede terry Ekspert
17. april 2007 - 10:19 #18
you need to include ORDER BY rnd(-(ID)*" & R & ") in each of the SELECTS
Avatar billede terry Ekspert
17. april 2007 - 10:22 #19
you could also make 3 queries, one for each category, then make a UNION select which puts them all together

SELECT * from qryCategory1
UNION
SELECT * from qryCategory2
UNION
SELECT * from qryCategory3
ORDER BY somefield
Avatar billede jensen363 Forsker
17. april 2007 - 10:24 #20
Fik du funktionen til at virke ????
Avatar billede showoff Nybegynder
17. april 2007 - 10:25 #21
nope fik ikke funktionen til at virke
Nu får jeg ny fejl i din funktion

Function Randomizer() As Integer
----------------------^
Avatar billede showoff Nybegynder
17. april 2007 - 10:29 #22
Til Terry.
Kommentar: terry
17/04-2007 10:19:58 you need to include ORDER BY rnd(-(ID)*" & R & ") in each of the SELECTS

Jamen det er jo det jeg skriver som giver fejl.... kun hvis jeg includerer order by en gang virker det, men så snart jeg bruger den flere gange får jeg fejl.

Det andet du forslår virker heller ikke, så får jeg denne fejl

Only those fields requested in the first query can be included in an ORDER BY expression.
Avatar billede terry Ekspert
17. april 2007 - 10:29 #23
your welcome to send me your dB

ekspertenATsanthell.dk
change AT to @
Avatar billede jensen363 Forsker
17. april 2007 - 10:29 #24
Har du mulighed for at zippe din db og maile den til mig ????
Avatar billede showoff Nybegynder
17. april 2007 - 10:32 #25
jo tak, men den er nu meget simpel.
Er på vej til Terry, har ikke din mail jensen
Avatar billede jensen363 Forsker
17. april 2007 - 10:33 #26
ose@post.dk
Avatar billede terry Ekspert
17. april 2007 - 10:57 #27
I've made two queries (only two categories)

qry1

SELECT TOP 5 sprg.fakultet, *
FROM sprg
WHERE (((sprg.fakultet)='samf') AND ((randomizer())=0))
ORDER BY Rnd(IsNull(ID)*0+1);

qry2
SELECT TOP 5 sprg.fakultet, *
FROM sprg
WHERE (((sprg.fakultet)='Humanistisk') AND ((randomizer())=0))
ORDER BY Rnd(IsNull(ID)*0+1);

and in a module the randomize function refred to in the link

then a UNION query which used both queries
SELECT * from qry1
UNION select * from qry2
ORDER BY ID;
Avatar billede terry Ekspert
17. april 2007 - 11:04 #28
if we keep to the example where you make a recordset then you would use

oRS.Open "qryUNION"
Avatar billede terry Ekspert
17. april 2007 - 11:04 #29
oRS.Open "SELECT * FROM qryUNION"
Avatar billede showoff Nybegynder
17. april 2007 - 11:11 #30
Hej Terry. Jeg forsøger blot at skrive dem ud som en #-separeret fil, der så skal læses ind i flash.

Nu får jeg dog denne fejl

[Microsoft][ODBC Microsoft Access Driver] Undefined function 'randomizer' in expression.
Avatar billede terry Ekspert
17. april 2007 - 11:16 #31
I have no idea what your doing but it works here.

There is a module (module2) you must have the code in your dB if you have amde another database.
Avatar billede jensen363 Forsker
17. april 2007 - 11:18 #32
Works here too
Avatar billede showoff Nybegynder
17. april 2007 - 11:21 #33
okay, hele min kode ser nu sådan ud.

<%@Language="VBScript"%>
<%
Session.LCID = 1030
%>
<%
Dim Serv, oConn, oRS, Ename, output, collect, SQL

Set oRS = Server.CreateObject("ADODB.Recordset")
Set oConn = Server.CreateObject("ADODB.Connection")

oConn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("db_sprg.mdb")
oConn.Open


oRS.Open "SELECT * from qryUNION ORDER BY ID" , oConn, 2, 3


Do While Not oRS.EOF
hentSprg=oRS("sprg")
hentSvar1=oRS("svar1")
hentSvar2=oRS("svar2")
hentSvar3=oRS("svar3")
hentFakultet=oRS("fakultet")
hentStudieretning=oRS("studieretning")

collect1 =collect1 & hentSprg&"#"
collect2 =collect2 & hentSvar1&"#"
collect3 =collect3 & hentSvar2&"#"
collect4 =collect4 & hentSvar3&"#"
collect5 =collect5 & hentFakultet&"#"
collect6 =collect6 & hentStudieretning&"#"

oRS.MoveNext
Loop

output1="&output1="& collect1
Response.Write output1
Response.Write "&"

output2="&output2="& collect2
Response.Write output2
Response.Write "&"

output3="&output3="& collect3
Response.Write output3
Response.Write "&"

output4="&output4="& collect4
Response.Write output4
Response.Write "&"

output5="&output5="& collect5
Response.Write output5
Response.Write "&"

output6="&output6="& collect6
Response.Write output6
Response.Write "&"

Counter = 1
Response.Write "Counter=" & Counter
Response.Write "&"
oRS.Close

Set oRS = Nothing
Set oConn = Nothing
%>

Men det er ligsomom den ikke forstår variablen "randomizer" skal jeg ikke definere den et sted eller hvad? JEg kan også godt se det virker i access når jeg går ind og i de tabeller du har lavet, men hvorfor kan så ikke skrive dem ud?
Avatar billede terry Ekspert
17. april 2007 - 11:21 #34
you can us ethe following code to export

DoCmd.TransferText acExportDelim, , "qryUNION", "C:\output.txt"
Avatar billede showoff Nybegynder
17. april 2007 - 11:23 #35
Ups jeg har måske slet ikke nævnt at jeg forsøger at skrive det ud med ASP
Avatar billede terry Ekspert
17. april 2007 - 11:23 #36
now how could we guess that you were using this in ASP?
Avatar billede jensen363 Forsker
17. april 2007 - 11:24 #37
Alle this work ;-(
Avatar billede showoff Nybegynder
17. april 2007 - 11:31 #38
Helt klart min fejl, så det som en selvfølgelighed at det skulle ud på et website, og var ikke engang klar over at man kunne lave de queries i har lavet direkte i databasen....så noget har jeg da lært.
Men det er da ikke spildt arbejde, for sqlen lader til at virke, skal blot lige have defineret den variabel "Randomizer" tror jeg.
Under alle omstændigheder er SQL-sproget vel det samme.
Avatar billede terry Ekspert
17. april 2007 - 11:31 #39
This might help.
Go back to the comment you gave 17/04-2007 09:41:24

Put each select in ()

(SELECT ....)
UNION
(SELECT ....)

and include the order by
Avatar billede terry Ekspert
17. april 2007 - 11:32 #40
and include the order by in each of the selects
and if you want to order the resultthen put the order by OUTSIDE the () at the end
Avatar billede terry Ekspert
17. april 2007 - 11:33 #41
You can make queries in Access which you can select from your ASP but the problem is when you use none-access functions in the SQL
Avatar billede showoff Nybegynder
17. april 2007 - 11:40 #42
SUPER.........det var blot det som skulle til.....Jeg er godt nok ked af hele den omvej, men tak Terry, poster du svar
Avatar billede terry Ekspert
17. april 2007 - 11:44 #43
:o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester