Выберите Случайный запрос в MySQL - PullRequest
0 голосов
/ 24 апреля 2018

В течение нескольких раз я использую для выбора случайных строк как:

$get_question = $user_home->runQuery('SELECT * FROM questions WHERE Level = :Level ORDER BY RAND()');

Эксперт сказал мне, что

RAND () - рецепт убийства сервера MySQL !!

Итак, с помощью этот ответ Я попробовал:

$get_question = $user_home->runQuery('SELECT * FROM questions AS r1 JOIN (SELECT CEIL(RAND() * (SELECT MAX(Sr) FROM questions)) AS Sr) AS r2 WHERE r1.Sr >= r2.Sr AND Level = :Level ORDER BY r1.Sr ASC LIMIT 1');

И вот как я отображаю результат:

echo $fetch_question['Question'] . "(" . $fetch_question['Id'] . ")";

И дисплей:

question(id)

Но, иногда отображается только:

()

Почему так? Какую ошибку я совершил?

Here is the Snapshot of my database having question!!

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Если у вас менее миллиона строк, ORDER BY RAND() LIMIT nn не является «убийцей».

Если вы все еще решаете, что это убийца, у вас есть несколько способов получить несколько случайных строк без полного сканирования таблицы : http://mysql.rjweb.org/doc.php/random (они выходят за рамки предположений Годо).

0 голосов
/ 25 апреля 2018

Я думаю, прежде всего вы должны знать max и min идентификаторы вашей таблицы:

select max(id) as mx , min(id) as mn  from questions 

затем сгенерируйте случайный идентификатор из PHP:

$randomId = rand($min, $max);

, затем выполните ваш запрос, используя $randomId:

SELECT * FROM questions WHERE id = $randomId

UPDATE:

Прежде всего получите целое число строк:

SELECT COUNT(*) FROM questions 

извлеките его в переменную PHP , сгенерируйте номер строки между нулем и номером строки:

$randNum = rand(0, $rowCount);

и затем выполните запрос так:

SELECT * FROM questions LIMIT $rowNumber, 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...