PHP MySQL选择随机行

时间:2010-07-27 01:01:32

标签: php mysql

我在选择6个随机朋友时遇到问题

这是我到目前为止的查询:

$result = num_rows("SELECT * FROM friends WHERE member_id = '".$_SESSION['userid']."'");
if($result >= 6) {
    $f_num = 6;
} else {
    $f_num = $result;
}
for($i = 1; $i <= $f_num; $i++) {
    $q_get_member_friends = mysql_query("SELECT * FROM friends WHERE member_id = '".$_SESSION['userid']."' ORDER BY rand() LIMIT 1");
    $r_get_member_friends = mysql_fetch_array($q_get_member_friends);
    echo $r_get_member_friends['friend_with'];
}

如果登录用户有多于或等于6个朋友,我想选择6个随机朋友

现在坚持了一段时间:/

感谢您的帮助:)

6 个答案:

答案 0 :(得分:17)

如果您使用:

  SELECT * 
    FROM friends 
   WHERE member_id = '".$_SESSION['userid']."' 
ORDER BY rand() 
   LIMIT 6

如果此人只有3个朋友,则查询将只显示这三个 - 这并不意味着查询将始终返回六行。

答案 1 :(得分:5)

我发现选择任意数量的随机记录的最佳方法是在查询中使用OFFSET。

假设你想要6个随机记录,所以我将借用上面的答案并计算数据库中朋友的总数。

$sql = mysql_query("SELECT COUNT(*) AS total FROM friends WHERE member_id='". $_SESSION['userid'] ."'");

$get_count = mysql_fetch_array($sql); // Fetch the results

$numfriends = $get_count['total']; // We've gotten the total number

现在我们将从上面的总数中获得6个随机记录(希望它是&gt; 6),

$query = mysql_query("SELECT * FROM friends WHERE member_id='". $_SESSION['userid'] ."' LIMIT 6 OFFSET " . (rand(0, $numFriends));


while ($rows = mysql_fetch_array($query))
{
  /// show your $rows here
}

使用OFFSET可能不是最好或最有效的,但它对我来说在大型数据库上有效,而不会让它们陷入困境。

答案 2 :(得分:1)

没关系,我明白了:) 不得不使用 :'D

答案 3 :(得分:0)

首先选择用户拥有的朋友数量:

"SELECT COUNT(*) as numFriends FROM friends WHERE member_id='".$_SESSION['userid']."'

...把​​它放到变量中,我们称之为“$ numFriends” 然后:

for($z=0;$z<6;$z++)
{
   $randomFriendIndex = rand(1,$numFriends);
   //Get the friend at that index
}

答案 4 :(得分:0)

在第八行将limit 1更改为limit 6

答案 5 :(得分:0)

而不是SELECT *开头,请尝试SELECT COUNT(*)并使用实际的返回值而不是num_rows()。

您的循环可能会生成重复项。我建议尝试OMG小马的回答。

书中SQL Antipatterns有一整章关于随机选择。