Imprimir una fila aleatoria desde una consulta mysql

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.

Pero no estoy muy convencido con mi guión. 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']."\"

Translate it to English:
"; } $i++; }

Estaba buscando algo como “echo $ Col [$ Randnum] [‘es’]” o “echo $ Col. $ Randnum [‘es’]” en lugar de usar todo el ciclo While para imprimir una sola fila al azar. ¿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 otros métodos que he visto, ya que usan el número con ORDER BY.

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

Hazlo en el lado de la consulta

 SELECT * FROM translations WHERE en IS NULL OR en='' ORDER BY rand() LIMIT 0,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 algunas alternativas ; confían en ejecutar dos, consultas separadas; sin embargo, suponiendo que tienes índices, eso no debería ser un problema.

Retrabajado para su escenario, 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);