Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL erhält einen zufälligen Wert zwischen zwei Werten

Eigentlich ROUND((RAND() * (max-min))+min) ist der beste Weg in MySQL, das zu tun, was Sie möchten. Es ist auch der beste Weg in ActionScript, JavaScript und Python. Ehrlich gesagt ziehe ich es dem PHP-Weg vor, weil es bequemer ist.

Da ich nicht weiß, wie viele Zeilen Sie zurückgeben werden, kann ich Ihnen nicht raten, ob es besser ist, PHP oder MySQL dafür zu verwenden, aber wenn Sie mit einer großen Anzahl von Werten arbeiten, sind Sie wahrscheinlich besser dran mit MySQL.

Nachtrag

Es stellte sich also die Frage, ob dies in PHP oder MySQL besser ist. Anstatt in eine Grundsatzdebatte einzusteigen, führte ich Folgendes aus:

<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 ist um etwa 2-3 % schneller.

Wenn Sie dies jedoch verwenden (beachten Sie, dass MySQL mehr Spalten zurückgibt):

<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 liegt um 3-4 % zurück (sehr inkonsistente Ergebnisse) (ungefähr die gleichen Ergebnisse, wenn Sie keine Array-Indexzuweisung für $r[2] verwenden).

Der Hauptunterschied liegt anscheinend in der Anzahl der an PHP zurückgegebenen Datensätze und nicht im Randomisierungssystem selbst. Wenn Sie also Spalte A, Spalte B und einen zufälligen Wert benötigen, verwenden Sie PHP. Wenn Sie nur den Zufallswert benötigen, verwenden Sie MySQL.