Avatar billede da_warbringer Nybegynder
17. august 2001 - 21:52 Der er 13 kommentarer og
1 løsning

vælg tilfældig

Hvordan kan man vælge at få en random text ud af flere i en mysql database. Altså hvilken command skal man så bruge?
Avatar billede erikjacobsen Ekspert
17. august 2001 - 21:54 #1
select *,random() as r from tabel order by r limit 1
Avatar billede milpoer Nybegynder
17. august 2001 - 21:55 #2
mysql_query(\"select * from DB order by rand() limit 1\");

Avatar billede erikjacobsen Ekspert
17. august 2001 - 21:56 #3
ups:
select *,random() as r from tabel order by r limit 1
Avatar billede mukke Nybegynder
17. august 2001 - 21:56 #4
jeg havde på et tidspunkt selv behov for noget lignende... Een mulighed er følgende:

hvis du har en tabel med 1000 poster, så finder du et tilfældigt tal mellem 1 og 1000.

Så kan du sige select * from tabel limit (X,1)

hvor x er dit tilfældige tal.


Det er dog ikke særlig optimalt - en anden måde, hvis du har en ID tilknyttet alle poster (ellers kan du evt. oprette en - du bliver glad for den i længden ;-) find it tilfældige tal og sig

select * from table where ID = x
Avatar billede erikjacobsen Ekspert
17. august 2001 - 21:56 #5
ups ups
select *,rand() as r from tabel order by r limit 1
Avatar billede erikjacobsen Ekspert
17. august 2001 - 21:57 #6
den der med rand() as r er nødvendig i lidt ældre MySQl-er, der ikke tillader et
udtryk efter ORDER BY
Avatar billede mukke Nybegynder
17. august 2001 - 21:57 #7
Hm.... alle de andre bud ser umiddelbart endnu være ud end mit forslag - rand() funktion skal jo køres een gang for hver post i databasen!
Avatar billede mukke Nybegynder
17. august 2001 - 22:00 #8
arrrrrrrrggg...

mysql> select *, rand() as r from domains order by r limit 1;
+-------+--------------+-------+---------+---------+----------------------+
| ID    | name        | check | Created | Deleted | r                    |
+-------+--------------+-------+---------+---------+----------------------+
| 18060 | aofherlev.dk |    1 | NULL    | NULL    | 4.16021794468185e-06 |
+-------+--------------+-------+---------+---------+----------------------+
1 row in set (27.11 sec)

mysql> select * from domains limit 150000,1;
+--------+------------+-------+---------+---------+
| ID    | name      | check | Created | Deleted |
+--------+------------+-------+---------+---------+
| 150001 | jyderne.dk |    1 | NULL    | NULL    |
+--------+------------+-------+---------+---------+
1 row in set (1.34 sec)


(fra database over alle danske domæner :)
Avatar billede erikjacobsen Ekspert
17. august 2001 - 22:06 #9
Ja, den er dyr mukke. Til at vælge et tilfældigt billede, banner eller lignende, er
den nu god nok - bare der ikke er for mange!
Avatar billede mukke Nybegynder
17. august 2001 - 22:07 #10
limit metoden er klart bedre, og ligeså nem at lave.

Men en ID vil nu altså være optimal.
Avatar billede erikjacobsen Ekspert
17. august 2001 - 22:10 #11
Den med rand() er lidt mere fleksibel, da den f.eks. kan vægtes med
hvor mange gange et billede har været vist. Fx. skal 2 billeder vises 1000
gange, det ene er blevet vist 800 gange det andet 200. Så kan man med
lidt aritmetik beregne det således at det andet billede blive vist lidt oftere end
det første, så deres visninger udjævnes.
Avatar billede mukke Nybegynder
17. august 2001 - 22:15 #12
OK, det kan måske bruges til specielle lejligheder, men generelt vil jeg ikke anbefale den.

Jeg mener - 27 sekunder om et sølle query... det er sgu ikke godt.

Avatar billede erikjacobsen Ekspert
17. august 2001 - 22:18 #13
ID du\'r ikke, da der kan være huller i (altså sådan en autonummereret, hvor
man har slettet lidt).
Avatar billede mukke Nybegynder
17. august 2001 - 22:22 #14
Ganske rigtigt, men der skal aligevel være MANGE huller før det bedre kan betale sig at bruge rand() end at blive ved med at forsøge til man får fat i en eksisterende post.
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
Computerworld tilbyder specialiserede kurser i database-management

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