views:

57

answers:

5

Hi, I have a problem selecting 6 random friends

This is the query I've got so far:

$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'];
}

I want to select 6 random friends if the logged in user has more or equal to 6 friends

Stuck on this for a while now :/

Thanks for any help :)

+1  A: 

If you use:

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

If the person only has 3 friends, the query will only show those three - it doesn't mean that the query will always return six rows.

OMG Ponies
Order by rand is dangerously slow with lots of data.
banzaimonkey
There's an article here with details and alternatives: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/
banzaimonkey
A: 

First select the number of friends that the user has:

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

...put that into a variable, let's call it "$numFriends" Then:

for($z=0;$z<6;$z++)
{
   $randomFriendIndex = rand(1,$numFriends);
   //Get the friend at that index
}
PIM
do I have to use that query in a num_rows or fetch_array?
Endre Hovde
A: 

change limit 1 to limit 6 on the eighth line.

no
A: 

Never mind, I figured it out :)
Had to use while not for :'D

Endre Hovde
A: 

Instead of SELECT * at the beginning, try SELECT COUNT(*) and use the actual return value instead of num_rows().

Your loop could generate duplicates. I would suggest trying OMG Ponies answer.

There is a whole chapter about random selection in the book SQL Antipatterns.

Marcus Adams