Avatar billede flodhesten Nybegynder
09. august 2006 - 11:33 Der er 10 kommentarer og
1 løsning

Forudsat sandsynlighed for tilfældig udtræk af database

Jeg har en database med omkring 200 recordset. Jeg skal have lavet en side, hvor den tilfældigt trækker en af de 200 ud.

Jeg skal dog have modificeret det lidt, for sandsynligheden for at netop den kommer ud skal være forudsat. For et felt kan der måske være 1 ud af 200 sandsynlighed for at komme (standard), et andet felt 1 ud af 100, et tredje felt med 1 ud af 500.

Jeg forstiller mig noget med at tilføje en ekstra kolonne i min tabel som skal indeholde nogle tal, og afhængigt af de tal er der en kode der regner ud hvor ofte det skal opstå.

Er det noget der kan lade sig gøre? Er det nemmere at gøre uden database? Ja, jeg har mange spørgsmål...
Avatar billede fennec Nybegynder
09. august 2006 - 11:57 #1
Det nemmeste er at have rækkerne til at stå flere gange via et join:

[Tabel1]
id, tekst
1, denne skal stå 2 gange
2, denne skal stå 3 gange
3, denne skal stå 1 gang

[joinTabel]
fremmedID
1
1
2
2
2
3

Så bruges denne select tli at få resultatet:
"select t.Tabel1 from Tabel1 t inner join joinTabel jt on jt.fremmedID=t.id"
1, denne skal stå 2 gange
1, denne skal stå 2 gange
2, denne skal stå 3 gange
2, denne skal stå 3 gange
2, denne skal stå 3 gange
3, denne skal stå 1 gang

Så er det bare at lave en almindelig random på den.
Avatar billede flodhesten Nybegynder
09. august 2006 - 12:24 #2
Hmm...

Hvis jeg har forstået det rigtigt (Lidt noob er man vel altid ;) ), bliver det så ikke lidt besværligt med 200 eller flere recordset og hvis der er nogle der skal vises ultra sjældent?
Avatar billede fennec Nybegynder
09. august 2006 - 12:56 #3
Et eller andet sted jo, men jeg kan ikke se andre muligheder. Lad os bare tage et simpelt eks med 2 rækker:
1, "denne skal vises 9 gange"
2, "denne skal vises 1 gang"

At lave en random som gennere 1 ni gange oftere end 2 er ikke nogen nem opgave (men kan dog lade sig gøre). At lave en random til +100 ræker, som alle har forskellig sansynlighed er noget nær umuligt. Prøv bare at smide en ekstra række på:

1, "denne skal vises 7 gange"
2, "denne skal vises 2 gang"
3, "denne skal vises 1 gang"

Jeg har ingen ide om hvordan den random skal kunne laves, men ved at udvide rækken til 10 i alt (7*1, 2*2 1*3), sker det helt automatisk.

Du skal altså kun koncentrere dig om at styre [joinTabel] tabellen, sa sansynlighederne passer.
Avatar billede hnteknik Novice
09. august 2006 - 13:49 #4
Jeg troede først at fennec havde lavet det smart, men du har fat i det rigtige.
lav udplukstabel:

id    tekst    Pcounter
1    den skal 1 gang    1
2    den skal 2 gange    2
3    den skal 6 gange    6

lave en ptabel
Pcounter    ID
1    1
2    2
2    3
3    4
3    5
3    6
4    7
4    8
4    9
4    10
5    11
5    12
5    13
5    14
5    15
6    16
6    17
6    18
6    19
6    20
6    21

lav et view
SELECT udplukstabel.id, udplukstabel.tekst, udplukstabel.Pcounter
FROM Ptabel INNER JOIN udplukstabel ON Ptabel.Pcounter = udplukstabel.Pcounter;

resulatet

id    tekst    Pcounter
1    den skal 1 gang    1
2    den skal 2 gange    2
2    den skal 2 gange    2
3    den skal 6 gange    6
3    den skal 6 gange    6
3    den skal 6 gange    6
3    den skal 6 gange    6
3    den skal 6 gange    6
3    den skal 6 gange    6
Avatar billede hnteknik Novice
09. august 2006 - 13:51 #5
Hvis man så også tilføjer en række med et tilfældigt stort tal, som man man sortere på - så de ikke ligger i en ordnet liste, så skulle være mere tilfældigt.

Henrik
Avatar billede hnteknik Novice
09. august 2006 - 13:58 #6
Hvis du tilføjer en replkerings-id til Ptabel og sorterer efter idet, så får du en tilfældigt blandet liste at plukke fra ;-)

se her

id    tekst    Pcounter    randommer
2    den skal 2 gange    2    {0A82B923-B271-410C-A3E2-CFF280ADE9BB}
3    den skal 6 gange    6    {3B91406E-2874-4E37-8D58-0CFBA2487AEB}
3    den skal 6 gange    6    {3E55BD70-D9D7-4D66-8DBD-E87617332270}
3    den skal 6 gange    6    {46770DED-22BE-4592-AF04-92F1D33B8B09}
2    den skal 2 gange    2    {579F2C44-F4DC-4002-8E68-6B4C8E881F1E}
1    den skal 1 gang            1    {CC1624A2-5B83-42DE-979B-767BA0336A1D}
3    den skal 6 gange    6    {D50287A4-8E98-48E2-9769-E09EA733159A}
3    den skal 6 gange    6    {E0F89D4C-28AF-4A88-B700-CF8FF8E6D486}
3    den skal 6 gange    6    {FDF42EB5-23F9-44A7-9DB5-8880CD2A9DF2}
Avatar billede flodhesten Nybegynder
09. august 2006 - 20:14 #7
Tak for hjælpen!
Avatar billede hnteknik Novice
09. august 2006 - 20:41 #8
Takker og bukker. men fennec burde have haft noget, da han lagde bunden ;-)
Avatar billede fennec Nybegynder
10. august 2006 - 09:04 #9
hnteknik >>
Du kan jo oprette et ? med nogle point til mig :o)
Avatar billede hnteknik Novice
10. august 2006 - 09:54 #10
Ja hvad vil du have? Nej det er noget gris at lave pointgivningsspg. Vi udligner en dag ;-)
Avatar billede flodhesten Nybegynder
11. august 2006 - 12:29 #11
Hov ja, det må du undskylde fennec. Så må jeg lige skylde dig lidt :-)
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
Kurser inden for grundlæggende programmering

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