2010-07-27 3 views
6

J'ai un problème en sélectionnant 6 amis au hasardPHP MySQL sélectionner des lignes aléatoires

Ceci est la requête que j'ai jusqu'à présent:

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

Je veux sélectionner 6 amis au hasard si l'utilisateur connecté a plus ou égal à 6 amis

Coincé sur ce point pour un certain temps maintenant:/

Merci pour toute aide :)

+1

Seulement si la personne a 6 amis ou plus? –

+0

Un peu hors sujet mais vous pouvez gagner du temps en utilisant des accolades dans les chaînes. A la place de ''". $ _ SESSION [' userid ']. "'" 'Vous pouvez utiliser' '{$ _SESSION [' userid ']}' ''' – Shubham

+0

seulement si la personne en a 6 ou plus, oui savoir :) – NoobiCake

Répondre

15

Si vous utilisez:

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

Si la personne a seulement 3 amis, la requête ne montrera que trois - cela ne signifie pas que la requête retourne toujours six lignes.

+5

La commande par rand est dangereusement lente avec beaucoup de données. – cbednarski

+1

Il y a un article ici avec des détails et des alternatives: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows- from-table/ – cbednarski

0

Sélectionnez d'abord le nombre d'amis que l'utilisateur:

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

... mettre cela en une variable, appelons-le "$ numFriends" Puis:

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

Dois-je utiliser cette requête dans num_rows ou fetch_array? – NoobiCake

0

changement limit 1 à limit 6 sur la huitième ligne.

1

Peu importe, je me suis dit dehors :)
Nous avons dû utiliser tout pas pour: 'D

0

Au lieu de SELECT * au début, essayez SELECT COUNT(*) et utiliser la valeur de retour réelle au lieu de num_rows().

Votre boucle peut générer des doublons. Je suggère d'essayer OMG Ponies répondre.

Il y a un chapitre entier sur la sélection aléatoire dans le livre SQL Antipatterns.

5

La meilleure façon que j'ai trouvée pour sélectionner n'importe quel nombre d'enregistrements aléatoires est avec OFFSET dans la requête. Disons que vous voulez 6 enregistrements aléatoires, donc je vais emprunter une réponse ci-dessus et compter le nombre total d'amis dans la base de données.

$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 

Maintenant, nous allons obtenir les 6 dossiers au hasard sur le total ci-dessus (nous espérons qu'il est> 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 
} 

L'utilisation OFFSET peut ne pas être le meilleur ou le plus efficace, mais il a travaillé pour moi sur de grandes bases de données sans les embourber.

Questions connexes