我需要从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,但它也是空的。 它似乎在刷新时从数据库中得不到任何东西,有时它从数据库中获取数据。知道为什么会这样吗?
答案 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);