Печать случайной строки из запроса mysql

Я искал способ создания виджета для совместной работы. Таким образом, у меня есть база данных mysql и таблица (называемые переводами) и небольшой скрипт, позволяющий пользователям переводить одну страницу за раз.

Но я не совсем уверен в моем сценарии. Я не думаю, что это достаточно эффективно. Во-первых, mysql получает все строки с пустым столбцом «en», а затем один из них отображается через экран через некоторое время. Есть ли другой способ сделать это? Это код:

//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++; } 

Я искал что-то вроде «echo $ Col [$ Randnum] ['es']" или "echo $ Col. $ Randnum ['es']" вместо использования цикла while while для печати одной случайной строки. Как я могу это реализовать? Если это просто вопрос оптимизации. Если бы вы могли придумать сценарий или идею, чтобы назначить $ Col только одну строку со случайным числом и пустой 'en' col, это было бы еще лучше! (Я думаю, что это невозможно, последний бит). Строка «en» – это текст, поэтому я не знаю, как реализовать другие методы, которые я видел, поскольку они используют число с ORDER BY.

Вы можете использовать ORDER BY RAND() LIMIT 1 в своем запросе для извлечения одной случайной строки из базы данных.

Сделать это на стороне запроса

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

Есть несколько способов сделать это.

@ Ответ ThiefMaster будет работать, но «order by rand ()» имеет довольно серьезные проблемы с производительностью на больших таблицах. Таким образом, я бы заполнил вашу таблицу примерами данных примерно того размера, в котором вы хотите вырасти, и проверьте производительность. Если это не проблема, оставьте ее как есть – преждевременная оптимизация – это корень всех злых!

Есть несколько альтернатив ; они полагаются на запуск двух отдельных запросов; однако, если у вас есть индексы, это не должно быть проблемой.

Переделано для вашего сценария, это становится:

 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);