Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL mendapatkan nilai acak antara dua nilai

Sebenarnya, ROUND((RAND() * (max-min))+min) adalah cara terbaik di MySQL untuk melakukan apa yang Anda inginkan. Ini juga merupakan cara terbaik dalam ActionScript, JavaScript, dan Python. Sejujurnya, saya lebih suka cara PHP karena lebih nyaman.

Karena saya tidak tahu berapa banyak baris yang akan Anda kembalikan, saya tidak dapat memberi tahu Anda apakah lebih baik menggunakan PHP atau MySQL untuk ini, tetapi jika Anda berurusan dengan sejumlah besar nilai, Anda mungkin lebih baik menggunakan MySQL.

Tambahan

Jadi, ada pertanyaan apakah ini lebih baik di PHP atau MySQL. Alih-alih berdebat tentang prinsip, saya menjalankan yang berikut:

<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 lebih cepat sekitar 2-3%.

Namun, jika Anda menggunakan ini (perhatikan, lebih banyak kolom yang dikembalikan oleh 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 tertinggal 3-4% (hasil yang sangat tidak konsisten) (hasil yang hampir sama jika Anda tidak menggunakan penetapan indeks array untuk $r[2]).

Perbedaan utama, tampaknya, berasal dari jumlah catatan yang dikembalikan ke PHP dan bukan sistem pengacakan itu sendiri. Jadi, jika Anda membutuhkan kolom A, kolom B, dan nilai acak, gunakan PHP. Jika Anda hanya membutuhkan nilai acak, gunakan MySQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masukkan nomor urut di MySQL

  2. mySQL ::masukkan ke tabel, data dari tabel lain?

  3. Pengelompokan berdasarkan tanggal, kembalikan baris meskipun tidak ada catatan yang ditemukan

  4. String pesanan SQL sebagai nomor

  5. MySQL, Kesalahan 126:File kunci salah untuk tabel