Avatar billede mc.lucifer Praktikant
06. november 2003 - 22:28 Der er 12 kommentarer og
2 løsninger

Optimering af RAND()

Jeg har nu siddet og kigget lidt på en RAND() Kode

Den fungere men kan den optimeres "Det er jeg ret sikker på"

<?
$foresp = mysql_query("select * FROM vidstedu");
$tip = mysql_num_rows($foresp);
$vidsteduat = rand(1, $tip);
$nyforesp = mysql_query("select Text FROM vidstedu where id = $vidsteduat");
$result= mysql_fetch_assoc($nyforesp);
?>

MC
Avatar billede erikjacobsen Ekspert
06. november 2003 - 22:33 #1
Den virker i hvert fald kun hvis du ikke har huller i dine id-er. De vil komme
hvis du sletter nogle poster. Du kan gøre 2 ting:

1) find antallet med count(*) i din sql
2) brug limit i din sql til at "hoppe" det rigtige sted hen
Avatar billede mc.lucifer Praktikant
06. november 2003 - 22:34 #2
går i gang med nr 1 men nr 2 forstår jeg altså ikke helt

MC
Avatar billede erikjacobsen Ekspert
06. november 2003 - 22:35 #3
select count(*) as antal FROM vidstedu

og så hent det tal ud - det er lidt blidere ved serveren.
Avatar billede mr_bacardi Nybegynder
06. november 2003 - 22:36 #4
der står en del (på engelsk) her:
www.php.net/rand
Det er vist rigtigt nok den ikke finder helt tilfældige tal, men tror det er svært og lave det bedre selv, se evt. nogen af de forslag på overstående link
Avatar billede erikjacobsen Ekspert
06. november 2003 - 22:37 #5
Ja, rand() er sikkert god nok til dette formål - men måske ikke til at udfylde
lotto-kuponer med. Derfor har de også http://php.net/mt_rand
Avatar billede mc.lucifer Praktikant
06. november 2003 - 22:39 #6
den skal bare fungere til en Vidste du

hvorden skal hente noget text tilfældigt i en DB

MC
Avatar billede mc.lucifer Praktikant
06. november 2003 - 22:43 #7
nu har jeg ikke været i php i et godt stykke tid og det er som sådanne ikke noget der haster da dette er mit Vinter projekt men ja jeg vil gerne optimere funktionen men den kager rimelilgt meget ud

select count(*) as antal FROM vidstedu

Antal hvad er det og hvor for jeg det fra ?

MC
Avatar billede erikjacobsen Ekspert
06. november 2003 - 22:45 #8
Du får bare een række med eet felt, der hedder antal
Avatar billede mc.lucifer Praktikant
06. november 2003 - 22:48 #9
$foresp = mysql_query("select count(*) as antal FROM vidstedu");
$vidsteduat = rand(1, $antal);
$nyforesp = mysql_query("select Text FROM vidstedu where id = $vidsteduat");
$result= mysql_fetch_assoc($nyforesp);

Sorry hvis jeg spøger dumt

den trækker med denne kode kun den først ud og lige meget hvor meget man exekvere scriptet så forbliver det det samme

MC
Avatar billede tipsen Nybegynder
06. november 2003 - 23:51 #10
Du kan prøve med:

$res = mysql_query("select count(*) as antal FROM vidstedu");
$antal = mysql_result($res, 0);
mysql_free_result($res);
$randnum = rand(1, $antal) - 1;
$res = mysql_query("SELECT Text FROM vidstedu LIMIT $randnum, 1);
$RandTxt = mysql_fetch_row($res);
mysql_free_result($res);
Avatar billede detox Nybegynder
07. november 2003 - 00:56 #11
Jeg har hørt om problemer med RAND() i nogle versioner af MySQL, men personligt har jeg ikke oplevet det. Så du kunne da forsøge med:

$res = mysql_query("SELECT Text FROM vidstedu ORDER BY RAND() LIMIT 1);
$text = mysql_result($res,0);
Avatar billede erikjacobsen Ekspert
07. november 2003 - 06:03 #12
Det er en nem løsning, detox, men den er langsom. Det er fint nok til små tabeller.
Avatar billede steven Nybegynder
07. november 2003 - 13:28 #13
Hej

Hvorfor vil du søge i databasen 2 gange? du kan optimere ved at bruge det recordset, som du hiver ud til at starte med.

<?
$foresp = mysql_query("select Text FROM vidstedu");
$antal = mysql_num_rows($foresp);
$vidsteduat = rand(1, $antal);
extract($foresp[$vidsteduat]);
//Du har nu variable $Text, som indeholder det du skal bruge
?>

/Steven
Avatar billede tipsen Nybegynder
07. november 2003 - 16:12 #14
steven: Har du selv prøvet den løsning?

[extract() tager et array som 1. inputargument - ikke en ressource, hvilket mysql_query() returnerer!]
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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