MySql中的快速随机行

时间:2014-06-20 15:16:31

标签: php mysql database

我需要从MySql数据库中生成一个随机行,我在这里找到了示例: http://akinas.com/pages/en/blog/mysql_random_row/

我想使用看起来像这样的解决方案3:

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `users` ");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `users` LIMIT $offset, 1 " );

我的代码现在看起来像这样:

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `users` ");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( "SELECT * FROM `users` WHERE profile_image='2' LIMIT $offset, 1 " );
$random_date = mysql_fetch_array($result);

echo $random_date['user_name']; //display username of random user

但是当我刷新页面时:大约有10次中有7次出现。没有用户名,我也试图打印出用户的ID,但它也是空的。 它似乎在刷新时从数据库中得不到任何东西,有时它从数据库中获取数据。知道为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

在这种特殊情况下,问题是您正在使用两个不同的查询;第一个查询是:

SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `users`

而第二个包括条件:

SELECT * FROM `users` WHERE profile_image='2' LIMIT $offset, 1
                      ^^^^^^^^^^^^^^^^^^^^^^^

两个查询都应该在相同的结果集上运行。

答案 1 :(得分:1)

这是因为在你的第一个查询中你没有位置,但在你做的第二个查询中。

如果你有50行,只有15行profile_image = 2这就是为什么大多数都没有出现的原因。

如果只有15个结果,例如

,您的查询就会变为LIMIT 30,1

确保在两个查询中使用相同的位置。

还要避免在新代码中使用mysql_ *函数

答案 2 :(得分:0)

我的问题的解决方案就是这个,非常感谢:@Jack

此查询将非常快速地在mysql表中找到随机行。

$gender_search =  $logged_in_user['gender_search'];

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `users` WHERE profile_image='2' AND gender='$gender_search'");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( "SELECT * FROM `users` WHERE profile_image='2' AND gender='$gender_search' LIMIT $offset, 1 " );
$random_date = mysql_fetch_array($result);

如果有人需要,我现在已将此字符串转换为PDO。

$statement = $dbConn->prepare("SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `users` WHERE profile_image=? AND gender=?");
$statement->execute(array('2',$logged_in_user['gender_search']));
$offset_row = $statement->fetch(PDO::FETCH_OBJ);
$offset = $offset_row->offset;

$statement2 = $dbConn->prepare("SELECT * FROM `users` WHERE profile_image=? AND gender=? LIMIT ?, 1");
$statement2->execute(array('2', $logged_in_user['gender_search'], $offset));
$random_date = $statement2->fetch(PDO::FETCH_BOTH);