sql >> Databasteknik >  >> RDS >> Mysql

MySQL får ett slumpmässigt värde mellan två värden

Faktiskt, ROUND((RAND() * (max-min))+min) är det bästa sättet i MySQL att göra vad du vill. Det är också det bästa sättet i ActionScript, JavaScript och Python. Ärligt talat föredrar jag det framför PHP eftersom det är bekvämare.

Eftersom jag inte vet hur många rader du kommer att returnera kan jag inte ge dig råd om det är bättre att använda PHP eller MySQL för detta, men om du har att göra med ett stort antal värden är du förmodligen bättre ställd. använder MySQL.

Tillägg

Så det var en fråga om detta är bättre i PHP eller MySQL. Istället för att ge mig in i en principdebatt körde jag följande:

<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 är snabbare med cirka 2-3%.

Om du använder detta, men (observera att fler kolumner returneras av 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 efter med 3-4 % (mycket inkonsekventa resultat) (ungefär samma resultat om du inte använder en arrayindextilldelning för $r[2]).

Den största skillnaden, verkar det, kommer från antalet poster som returneras till PHP och inte själva randomiseringssystemet. Så om du behöver kolumn A, kolumn B och ett slumpmässigt värde, använd PHP. Om du bara behöver det slumpmässiga värdet, använd MySQL.



  1. använder CASE i WHERE-satsen

  2. Uppföljningsgräns och kompensera felaktig placering i frågan

  3. Kan inte ansluta till postgres från fjärrvärden

  4. Ta bort poster före ett visst datum