2012-12-07 74 views
1

我试图从我的表中显示一个随机记录,但没有运气,这是我所要做的。这是编码在PHP显示随机mysql记录 - PHP

$range_result = mysql_query("SELECT MAX() AS max_id , MIN() AS min_id FROM pages"); 
$range_row = mysql_fetch_object($range_result); 
$random = mt_rand($range_row->min_id , $range_row->max_id); 
$result_random = mysql_query("SELECT * FROM pages WHERE id >= $random LIMIT 0,1"); 
echo $result_random; 

想知道这是否是一个明显的错误?我已经连接到数据库了。

JB

+0

您可以尝试添加“按RAND()排序”,但是这是已知的,要求服务器进行更多的处理。 –

+0

http://stackoverflow.com/questions/1244555/how-can-i-optimize-mysqls-order-by-rand-function –

+0

使用mysql_query的返回值和mysql_error() –

回答

5

你应该直接的SQL这样做有mysqli_multi_query性能:

// First query gets the random ID, second gets the associated row 
$sql = "SELECT @id:=FLOOR(RAND()*(MAX(id) - MIN(id))) + MIN(id) FROM pages; 
     SELECT * FROM pages WHERE id = @id;" 

// Create a mysqli object and execute the multi-query 
$mysqli = new mysqli($host, $user, $pass, $db_name); 
$mysqli->multi_query($sql); 
$result = $mysqli->store_result(); 

// Grab the first row from the first resultset 
if ($row = $result->fetch_assoc()) { 
    print_r($row); 
} 
+0

为什么讨厌?这是一个很好的解决方案! –

+1

我认为downvote来自于具有mysql_函数中的WHERE ORDER BY的初始文章。不知道虽然 –

+0

很确定WHERE ORDER BY会导致错误,并且mysql_总是在本站点受到攻击。只是说...不是我。 –

1

你为什么不只是使用兰特():

"SELECT * FROM pages ORDER BY RAND() Limit 1" 

但是,为了回答,什么是MIN和MAX选择。如果没有定义?你应该尝试:

"SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM pages" 

而且我不认为你需要在极限的偏移量。所以只有极限1可能会很好。

作为注释状态,对于较大的数据集,RAND()可能会很慢,但在很多情况下这不是问题,并且滞后极小,除非您拥有特殊数量的数据。阅读弗兰克的链接以查看详细信息。但个人而言,我从来没有真正遇到RAND()速度问题。正如Michael所说,你应该试着在回应你认为是结果集的东西之前取回结果。

而且,mysql_函数已被弃用。您应该切换到mysqliPDO

+1

http:// www检查sql错误。 webtrenches.com/post.cfm/avoid-rand-in-mysql –

+1

只适用于小数据集 – 2012-12-07 00:41:01

+0

+1因为'ORDER BY RAND()'是许多应用程序的简单工作解决方案,其中没有大表。 –

0

尽管你会通过RAND()好得多排序,你的方法是可行的。你的问题是你试图回显一个MySQL结果集。您需要在您的代码后执行以下操作:

$row = mysql_fetch_assoc($result_random); 
echo $row['field1'] . " " . $row['field2']; 

其中field1和field2是表中列的名称。