Резюме : в этом руководстве вы изучите различные методы выбора случайных записей из таблицы базы данных в MySQL.
Иногда вам нужно выбрать случайные записи из таблицы, например:
- Выделите несколько случайных постов в блоге и отобразите их на боковой панели.
- Выбор случайной цитаты для отображения виджета «Цитата дня».
- Выбор случайных картинок в галерее и использование в качестве рекомендуемых картинок.
MySQL выбирает случайные записи, используя ORDER BY RAND()
MySQL не имеет встроенного оператора для выбора случайных строк из таблицы. Для этого вы используете функцию RAND().
Следующий запрос выбирает случайную строку из таблицы базы данных:
SELECT * FROM table_name ORDER BY RAND() LIMIT 1;
Давайте рассмотрим запрос более подробно.
- Функция RAND() генерирует случайное значение для каждой строки в таблице.
- Предложение ORDER BY сортирует все строки в таблице по случайному числу, сгенерированному функцией RAND().
- Предложение LIMIT выбирает первую строку в наборе результатов, отсортированных случайным образом.
Если вы хотите выбрать N случайных записей из таблицы базы данных, вам нужно изменить предложение LIMIT следующим образом:
SELECT * FROM table_name ORDER BY RAND() LIMIT N;
Смотрите следующую customersтаблицу из примера базы данных.
В следующем примере выбираются пять случайных клиентов из таблицы customers:
SELECT customerNumber, customerName FROM customers ORDER BY RAND() LIMIT 5;
Обратите внимание, что вы можете получить другой набор результатов, потому что он случайный.
Эта техника очень хорошо работает с небольшим столом. Тем не менее, это будет медленно для большой таблицы, потому что MySQL должен отсортировать всю таблицу, чтобы выбрать случайные.
Скорость запроса также зависит от количества строк в таблице. Чем больше строк в таблице, тем больше времени требуется для генерации случайного числа для каждой строки.
MySQL выбирает случайные записи, используя предложение INNER JOIN
Этот метод требует, чтобы таблица имела поле первичного ключа с автоинкрементом и в последовательности не было пробела.
Следующий запрос генерирует случайное число на основе столбца первичного ключа:
SELECT ROUND(RAND() * ( SELECT MAX(id) FROM table_name)) AS id;
Мы можем объединить таблицу с набором результатов, возвращенным вышеуказанным запросом, следующим образом:
SELECT t.* FROM table_name AS t INNER JOIN (SELECT ROUND( RAND()* (SELECT MAX(id) FROM table_NAME )) AS id ) AS x WHERE t.id >= x.id LIMIT 1;
Используя эту технику, вы должны выполнить запрос несколько раз, чтобы получить более одной случайной строки, потому что, если вы увеличите лимит, запрос выдаст только последовательные строки, которые начинаются со случайно выбранной строки.
Следующий запрос возвращает случайного клиента из таблицы customers.
SELECT t.customerNumber, t.customerName FROM customers AS t JOIN (SELECT ROUND(RAND() * (SELECT MAX(customerNumber) FROM customers)) AS customerNumber ) AS x WHERE t.customerNumber >= x.customerNumber LIMIT 1;
MySQL выбирает случайные записи, используя переменные
В случае, если в таблице есть столбец id со значениями, которые попадают в диапазон, 1..N и в диапазоне нет пропуска, вы можете использовать следующую технику:
- Сначала выберите случайные числа в диапазоне 1..N.
- Во-вторых, выберите записи на основе случайных чисел.
Следующее утверждение поможет вам сделать это:
SELECT table. * FROM (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table)) random_num, @num:=@num + 1 FROM (SELECT @num:=0) AS a, table LIMIT N) AS b, table AS t WHERE b.random_num = t.id;
Обратите внимание, что пользовательские переменные зависят от соединения. Это означает, что эту технику нельзя использовать с пулом соединений. Кроме того, первичный ключ должен быть целочисленным, а его значения должны быть в последовательности без пробелов.
В этом уроке мы показали вам несколько приемов выбора случайных записей из таблицы.