当前位置: 首页 > 面试题库 >

MySQL获得两个值之间的随机值

凌修伟
2023-03-14
问题内容

我连续有两列:min_valuemax_value。有没有一种方法可以像这样进行选择:

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

我确实意识到那RAND是另一回事。我最接近(带有帮助)的是(RAND() * (max- min))+min,尽管它会产生一个浮点数,然后我需要它到ROUND(),这完全是错误的。

除非有人能提出替代方案(这将非常有用),否则我将采用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。



 类似资料:
  • 问题内容: 我想知道如何在两个给定值之间生成一个随机数。 我可以使用以下内容生成一个随机数: 但是,如何生成0到100(含)之间的随机数? 问题答案: 你可以使用例如 r.nextInt(101) 对于更通用的“在两个数字之间”,请使用: 这会为你提供介于10(含)和100(不含)之间的随机数

  • 问题内容: 我想在两个小十进制数字之间获取一个随机数。 在0.8到1.3之间。 要么 谢谢! 问题答案: 斯威夫特5: 使用random(in :) 返回指定范围内的随机值: 每个苹果: random()静态方法从范围内的连续均匀分布中选择一个随机值,然后将该值转换为该类型中最接近的可表示值。 请参阅random(in:using:)以指定默认值以外的随机生成器。

  • 问题内容: 如果记录日期时间范围涵盖今天,我想显示记录。(此示例的3和4) 我尝试用两个来做到这一点,它在第二秒给出了语法错误。 我怎样才能做到这一点? 问题答案:

  • 嗨,我正试图得到相反的价值观之间 我通过这种方式获得了一些数据: 但是我需要相反的数据,怎么才能得到呢? 谢谢

  • 问题内容: 我在Python中有两个列表,如下所示: 我需要用第一个列表中的项目创建第二个列表,而第二个列表中没有这些项目。从示例中,我必须得到: 有没有循环和检查的快速方法吗? 问题答案: 当心 你可能期望/希望它等于的位置。如果你想作为答案,则需要使用