如何确保随机选择的两行彼此不同?

时间:2015-05-09 05:40:25

标签: php mysql

我问过这个问题yesterday并且收到了一个简单的解决方案,但它是关于ORDER BY rand()的,我被告知这对大型表来说是低效的。我搜索了网络,发现这是一种更有效的方法:

  1. 获取表格中的总行数:$rows
  2. 使用mt_rand$row1_id设置为介于1和总行数之间的随机数:$row1_id = mt_rand(1,$rows)
  3. 再次使用mt_rand$row2_id设置为介于1和总行数之间的随机数:$row2_id = mt_rand(1,$rows)
  4. 运行查询以选择随机行,即
  5. mysqli_query($conn,"SELECT * FROM photos WHERE photo_id=$row1_id") mysqli_query($conn,"SELECT * FROM photos WHERE photo_id=$row2_id")

    但是,我需要确保$row1_id!= $row2_id(随机生成的数字必须彼此不同)。我尝试使用if语句,但它只减少了数字相同的机会,但它仍然有可能。

    任何一个简单的解决方案吗?

3 个答案:

答案 0 :(得分:1)

只需在循环中生成第二个随机数,以确保它不等于第一个。很可能这个循环只执行一次。

$num1 = mt_rand(...);
$num2 = 0;

do {
  $num2 = mt_rand(...);
} while($num2 == $num1);

// $num1 and $num2 are guaranteed to be different

此方法适用于您,只要您的行ID是连续的,没有间隙

如果存在差距,您需要生成新的数字,直到两者都导致数据库命中。这样的事情。

$photo1 = null;
$photo2 = null;

do {
  $num = mt_rand(...);
  $photo1 = mysql_query(...);
} while(mysqli_num_rows($photo1) == 0);

$photo1 = mysqli_fetch_assoc($photo1);

do {
  $num = 0;
  do {
    $num = mt_rand(...);
  } while($num == $photo1['id']);
  $photo2 = mysql_query(...);
} while(mysqli_num_rows($photo2) == 0);

$photo2 = mysqli_fetch_assoc($photo2);]

您可以将这些方法与order by rand()选项进行比较,看看哪些方法更具效果。

答案 1 :(得分:0)

对昨天的查询稍作修改。试试这个查询 -

SELECT * FROM photos GROUP BY photo_id ORDER BY rand() LIMIT 2

答案 2 :(得分:0)

您必须尝试where子句和IN功能。

SELECT * FROM photos WHERE photo_id IN ($row1_id, $row2_id);