2012-04-01 19 views
5

Estaba buscando una forma de crear un widget de traducción colaborativa. Así que tengo una base de datos y una tabla mysql (llamadas traducciones) y un pequeño script para permitir a los usuarios traducir una página a la vez.Imprimir una fila al azar de una consulta de mysql

Pero no estoy del todo convencido con mi script. No creo que sea lo suficientemente eficiente. Primero, el mysql obtiene todas las filas con la columna vacía 'en', y luego una pantalla muestra una de ellas por un tiempo. ¿Hay otra manera de hacer esto? Este es el código:

//Retrieve all the data from the "translations" table 
$result = mysql_query("SELECT * FROM translations WHERE en IS NULL OR en=''") or die(mysql_error()); 

$Randnum=rand(0,mysql_num_rows($result)-1); //Gets a random number between 0 and the maximum number of rows 
$i=0; //Start to 0 
while($Col = mysql_fetch_array($result)) //While there are rows to evaluate 
    { 
    if ($i==$Randnum) 
     { 
     echo "\"".$Col['es']."\"<br><br>Translate it to English: <br>"; 
     } 
    $i++; 
    } 

que estaba buscando algo así como "echo $ Col [$ Randnum] [ 'es']" o "echo $ Col. $ Randnum [ 'es']" en lugar de utilizar todo el ciclo While para imprimir una sola fila aleatoria. ¿Cómo puedo implementar esto? Si solo es una cuestión de optimización. Si pudieras venir con un guion o idea para asignarle a $ Col solo UNA fila con un número aleatorio y el 'en' col vacío, ¡eso sería aún mejor! (Creo que no es posible esto último). La fila 'en' es texto, así que no sé cómo implementar other methods que he visto ya que usan el número con ORDER BY.

Respuesta

7

Puede usar ORDER BY RAND() LIMIT 1 en su consulta para buscar una sola fila aleatoria de la base de datos.

+0

+1 por ser el primero, aunque es 'RAND()' :) –

+0

¿Funcionará incluso con el texto? Incluso si funciona, ¿no seleccionaría el texto que tiene el primer ASCII como dijo rand()? (por ejemplo, si muchas filas comienzan con 'H', ¿no seleccionará solo la primera CADA vez que rand() es 72?) –

+0

@FrankPresenciaFandos: No está relacionado con los datos en su tabla. Genera internamente un número aleatorio para cada fila y luego ordena por ese número. – ThiefMaster

2

hacerlo en el lado consulta

SELECT * FROM translations WHERE en IS NULL OR en='' ORDER BY rand() LIMIT 0,1 
1

Hay algunas maneras de hacer esto.

@ La respuesta de ThiefMaster funcionará, pero "ordenar por rand()" tiene problemas de rendimiento bastante grandes en tablas grandes. Por lo tanto, rellenaría su tabla con datos de muestra de aproximadamente el tamaño que desea para poder crecer y probar el rendimiento. Si no es un problema, déjalo tal como está: ¡la optimización prematura es la raíz de todo mal!

Hay algunos alternatives; confían en ejecutar dos, consultas separadas; sin embargo, suponiendo que tienes índices, eso no debería ser un problema.

vuelto a trabajar para su scenarion, esto se convierte en:

mysql_query('SELECT @count := COUNT(*) FROM translations WHERE en IS NULL OR en='''); 
mysql_query('SET @offset = CONVERT(FLOOR(RAND() * @count), SIGNED)'); 
mysql_query('PREPARE mystatement FROM "SELECT * FROM translations WHERE en IS NULL OR en='' LIMIT ?, 1"'); 
$res = mysql_query('EXECUTE mystatement USING @offset'); 
$row = mysql_fetch_assoc($res); 
print_r($row); 
+0

No espero que esta tabla crezca más de 2000/3000 filas en el futuro, pero gracias por ampliar la información. También me gustó la cita "la optimización prematura es la raíz de todo mal". –

+0

No es mío, y alguien señaló que poner "prematuro" frente a casi cualquier cosa lo hace sonar mal ... –

+0

Lo siento, quise decir, gracias por la cita que me llevó a leer un montón de cosas interesantes sobre el internet (; –

Cuestiones relacionadas