我一行有两列:min_valuemax_value.有没有办法进行如下 Select :

SELECT RAND(`min_v`, `max_v`) `foo` [..]

我确实意识到RAND的作用不同;我(在帮助下)找到的最接近的数字是(RAND() * (max-min))+min,尽管它会产生一个浮点数,然后我需要将其四舍五入(),这完全是错误的.

除非我建议任何人都可以 Select PHP.

推荐答案

事实上,ROUND((RAND() * (max-min))+min)是MySQL中做你想做的事情的最好方式.它也是ActionScript、JavaScript和Python中的最佳方式.老实说,我更喜欢PHP方式,因为它更方便.

因为我不知道要返回多少行,所以我不能建议您使用PHP还是MySQL来实现这一点,但是如果您要处理大量的值,那么使用MySQL可能会更好.

补遗


所以,有一个问题是,这在PHP还是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) 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的速度提高了2-3%.

但是,如果您使用它(请注意,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落后3-4%(结果非常不一致)(如果不对$r[2]使用数组索引分配,结果大致相同).

主要的区别似乎来自返回PHP的记录数量,而不是随机化系统本身.因此,如果需要A列、B列和一个随机值,请使用PHP.如果只需要随机值,那么使用MySQL.

Mysql相关问答推荐

MySQL没有使用S隐式附加到此二级索引的主键

MySQL生成的整型计算可以为空吗?

了解查询中ORDER BY的行为

在MySQL和JavaFX中保存和检索图像文件

不分组寻呼

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

获取 MySQL 中每一行之间负差的总和

带有 PARTITION BY 子句的 ROW_NUMBER() 停止在 MariaDB 上工作

在分组结果 MySQL 5.7 版中获取最多的重复值

限制正则​​表达式中多字符通配符的范围

是否可以从 .SQL 文件中计算表中的行数?

MySQL按连续值和计数分组

SQL UPDATE中的str_replace?

mysql错误:错误1018(HY000):无法读取'.'的目录(错误号:13)

为什么数据库行元组中的整数具有L后缀?

MySQL Workbench 无法加载 mysql.proc

MySQL 整数与日期时间索引

如何在 python 中逐行获取 MySQL ResultSet

MySQL 导出到 outfile:CSV 转义字符

如何在执行 sql 脚本时 echo 打印语句