Случайная выборка записей mysql

1,00
р.
Как можно организовать случайный выбор записей из таблицы, посредством одного запроса?
P.S.: Имеется таблица статей, а также сводная таблица (статьи на тему), со ссылкой на первую таблицу. Нужно добавить в сводную таблицу N записей, указателей на статьи случайным образом.
Можно ли как-то случайно выбирать строки из таблицы в запросе?

Ответ
Если размер таблицы статей articles не велик, можно отсортировать записи в случайном порядке, например, при помощи конструкции ORDER BY RAND(). Вставить записи в сводную таблицу theme_articles можно при помощи запроса INSERT ... SELECT ...
INSERT INTO theme_articles SELECT * FROM articles ORDER BY RAND() LIMIT 2
К сожалению, у конструкции ORDER BY RAND() печальная слава, так как чаще всего она означает сортировку данных на жестком диске. Уменьшить вероятность этого события можно уменьшив размер промежуточной таблицы. Даже если EXPLAIN сообщает о сортировке в файле, при небольшом размере таблицы, высока вероятность, что сортировка пройдет все-таки в оперативной памяти (особенно, если значение директивы tmp_table_size достаточно высоко - несколько десятков мегабайт).
В любом случае имеет смысл сортировать в случайном порядке не всю таблицу, а лишь первичные ключи - это уменьшит размер сортируемой промежуточной таблицы
INSERT INTO theme_articles SELECT m.* FROM (SELECT id FROM articles ORDER BY RAND() LIMIT 2) AS r LEFT JOIN articles AS m USING(id)
Такой вариант подойдет уже для средних таблиц. Если же у вас имеется возможность выбрать первичные ключи в случайном порядке вне СУБД - это самый идеальный вариант в случае гигантских таблиц (достигающих гигабайтных размеров). Как правило, в таких случаях СУБД используют совместно с каким-нибудь NoSQL-решением, полностью расположенным в оперативной памяти. Можно попробовать извлечь идентификаторы случайных статей из него (что заведомо быстрее MySQL завязанной на транзакции и жесткий диск) и воспользоваться первым запросом, задействовав для выбора статей конструкцию IN
INSERT INTO theme_articles SELECT * FROM articles WHERE id IN (252, 1024)
Запросы выше предполагают, что структура таблиц идентичная, первичный ключ имеет имя id, а количество вставляемых случайных записей равно 2.