sql >> Database teknologi >  >> RDS >> Mysql

MySQL får en tilfældig værdi mellem to værdier

Faktisk, ROUND((RAND() * (max-min))+min) er den bedste måde i MySQL at gøre det, du gerne vil. Det er også den bedste måde i ActionScript, JavaScript og Python. Helt ærligt, jeg foretrækker det frem for PHP-måden, fordi det er mere bekvemt.

Fordi jeg ikke ved, hvor mange rækker du vil returnere, kan jeg ikke rådgive dig, om det er bedre at bruge PHP eller MySQL til dette, men hvis du har at gøre med et stort antal værdier, er du sandsynligvis bedre stillet ved hjælp af MySQL.

Tillæg

Så der var et spørgsmål om, hvorvidt dette er bedre i PHP eller MySQL. I stedet for at gå ind i en debat om principper, kørte jeg følgende:

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL er hurtigere med omkring 2-3%.

Hvis du dog bruger dette (bemærk, flere kolonner vender tilbage af MySQL):

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) as rd, 200 as two, 10 as ten FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL kommer bagud med 3-4 % (meget inkonsistente resultater) (omtrent de samme resultater, hvis du ikke bruger en array-indekstildeling for $r[2]).

Den største forskel, ser det ud til, kommer fra antallet af poster, der returneres til PHP og ikke selve randomiseringssystemet. Så hvis du har brug for kolonne A, kolonne B og en tilfældig værdi, skal du bruge PHP. Hvis du kun har brug for den tilfældige værdi, så brug MySQL.



  1. Oracle Trigger ORA-04098:Triggeren er ugyldig og mislykket genvalidering

  2. MySQL Preferred Engine – MyISAM eller InnoDB

  3. Implementering af Levenshtein distance til mysql/fuzzy søgning?

  4. Sådan fungerer WEEKOFYEAR() i MariaDB