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

标签 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. 运行查询以选择随机行,即

mysqli_query($conn,"从照片中选择 * WHERE photo_id=$row1_id") mysqli_query($conn,"从照片中选择 * WHERE photo_id=$row2_id")

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

有什么简单的解决方案吗?

最佳答案

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

$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() 选项进行比较,看看哪种方法性能更高。

关于php - 如何确保随机选择的两行彼此不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30136457/

相关文章:

php - CSS,圆 Angular 不起作用

php - 通过类递归进行函数调用?

mysql - 如何在sql表中选择数据时忽略重复项

mysql - 学生出勤表结构

php - 将 codeigniter 2.0 与 Datamapper 一起使用时类名冲突?

php - 使用事件记录根据其他表中包含与外键相同的 id 的每个 id 计算行数

php - PHP 中的数据标准?

mysql - SQL 代码不工作,未知错误

mysql - 使用 ActiveRecord 和 MySQL 插入 DATETIME

PHP - 如何使用表单桥接表