2010-07-27 22 views
6

tengo un problema seleccionando al azar 6 amigosPHP MySQL seleccionar filas aleatorias

Ésta es la pregunta que tengo hasta ahora:

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

Quiero seleccionar 6 amigos al azar si el usuario conectado ha más o igual a 6 amigos

Pegado a este desde hace un tiempo:/

Gracias por cualquier ayuda :)

+1

¿Solo si la persona tiene 6 o más amigos? –

+0

Un poco fuera de tema pero puede ahorrar tiempo usando llaves en cadenas. Me gusta en lugar de ''". $ _ SESSION [' userid ']. "'" 'Puede usar' '{$ _SESSION [' userid ']}' "' – Shubham

+0

solo si la persona tiene 6 o más, sí bueno para saber :) – NoobiCake

Respuesta

15

Si utiliza:

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

Si la persona sólo tiene 3 amigos, la consulta sólo mostrará los tres - no significa que la consulta siempre devolverá seis filas.

+5

El orden por rand es peligrosamente lento con muchos datos. – cbednarski

+1

Aquí hay un artículo con detalles y alternativas: http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows- from-table/ – cbednarski

0

primer lugar, seleccione el número de amigos que el usuario tiene:

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

... poner esto en una variable, vamos a llamarlo "$ numFriends" continuación:

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

¿Tengo que usar esa consulta en num_rows o fetch_array? – NoobiCake

0

cambio limit 1 a limit 6 en la octava línea.

1

No importa, lo he descubierto :)
Tuvimos que usar mientras no para: 'D

0

En lugar de SELECT * al principio, tratar SELECT COUNT(*) y utilizar el valor de retorno real en lugar de num_rows().

Su bucle podría generar duplicados. Sugiero probar la respuesta de los Potros de OMG.

Hay un capítulo completo sobre la selección aleatoria en el libro SQL Antipatterns.

5

La mejor manera que he encontrado para seleccionar cualquier cantidad de registros aleatorios es con DESPLAZAMIENTO en la consulta.

Digamos que quiere 6 registros aleatorios, por lo que tomaré prestado de una respuesta anterior y contaré el número total de amigos en la base de datos.

$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 

Ahora vamos a llegar a los 6 registros aleatorios de un total superior (esperemos que es> 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 
} 

uso de desplazamiento puede no ser la mejor o más eficiente, pero ha trabajado para en grandes bases de datos sin atascarlas.

Cuestiones relacionadas