2010-07-27 139 views
6

我有选择6周随机的朋友PHP MySQL的随机选择行

这是查询到目前为止,我有一个问题:

$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周的朋友

憋屈这个现在一会儿:/

感谢所有帮助:)

+1

只有当人有6周或更多的朋友? – 2010-07-27 01:04:09

+0

有点偏离主题,但您可以通过在字符串中使用大括号来节省时间。象,而不是' ' “$ _ SESSION [ '用户ID'。”' “'你可以使用' '{$ _SESSION [' 用户ID ']}'”' – Shubham 2010-07-27 01:12:24

+0

只有当人有6个或更多,是 好知道:) – NoobiCake 2010-07-27 01:16:20

回答

15

如果你使用:

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

如果人只有3个朋友,查询将只显示这三个 - 这并不意味着该查询总是会返回六行。

+5

兰特订购是危险的缓慢与大量的数据。 – cbednarski 2010-07-27 01:55:01

+1

这里有一篇文章详细介绍和替代方法:http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows- from-table/ – cbednarski 2010-07-27 02:02:48

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 
} 
+0

我必须在num_rows或fetch_array中使用该查询吗? – NoobiCake 2010-07-27 01:18:52

0

变化limit 1到第八行的limit 6

1

没关系,我理解了它:)
只好用没有:'D

0

代替SELECT *之初,尽量SELECT COUNT(*)并用实际的返回值,而不是NUM_ROWS的()。

你的循环可能会产生重复。我会建议尝试OMG小马的答案。

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

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只随机记录了上述总的(希望这是> 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可能不是最好的,最有效的,但它的工作我在大型数据库上没有让他们陷入困境。