我问了这个问题yesterday并收到了一个简单的解决方案,但它是关于 ORDER BY rand() 的,我被告知这对于大型表来说效率低下。我在网上搜索了一下,发现这是一个更有效的方法:
- 获取表中的总行数:
$rows
- 使用
mt_rand
将$row1_id
设置为 1 到总行数之间的随机数:$row1_id = mt_rand(1,$rows)
- 再次使用
mt_rand
将$row2_id
设置为 1 到总行数之间的随机数:$row2_id = mt_rand(1,$rows)
- 运行查询以选择随机行,即
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/