我问过这个问题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,"SELECT * FROM photos WHERE photo_id=$row1_id")
mysqli_query($conn,"SELECT * FROM photos WHERE photo_id=$row2_id")
但是,我需要确保$row1_id
!= $row2_id
(随机生成的数字必须彼此不同)。我尝试使用if语句,但它只减少了数字相同的机会,但它仍然有可能。
任何一个简单的解决方案吗?
答案 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);