Случайная строка из таблицы

Как вывести случайную строку из таблицы базы данных MySQL.
  • Вопрос задан
  • 3883 просмотра
Решения вопроса 1
bubuq
@bubuq
Если табличка не очень большая,
Select * From TABLE Order By rand() Limit 1;
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
AmdY
@AmdY
PHP и прочие вебштучки
очень советую погуглить по данной теме. но в честь праздника дам готовый ответ, но обещайте погуглить, очень полезна информация
SELECT pk, data
FROM test AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(pk)
FROM test)) AS id)
AS r2
WHERE r1.pk >= r2.id
ORDER BY r1.pk ASC
LIMIT 1;

тестировал на миллионе реальных записей, шустренько.
Ответ написан
SwampRunner
@SwampRunner
Самый быстрый способ генерировать ключи по которым делать выборку на php или другом языке и выбирать в базе через WHERE, это самый быстрый способ. Но в таблице не должно быть дыр, поэтому формируйте временную таблицу без дыр и уже выбирайте из неё, ну и пересоздавайте её через какое-то время по крону. Вот выборка 7-ми записей:

<?php
$max_sort_n = $db->query("SELECT MAX(sort_n) FROM users", array(), "el");

$sort_n = rand(7, $max_sort_n);

if($max_sort_n)
{
  $res = $db->query("SELECT id, login FROM users WHERE sort_n BETWEEN ?i AND ?i", array($sort_n - 6, $sort_n), "assoc");
}
?>
Ответ написан
@PlatinumArcade
Я делал так:
1. Вычисляешь общее количество строк в таблице с пом. COUNT(*). Суем цифру в $count.
2. На php генеришь случайное число, от 1 до $count. Суем в $rnd.
3. Делаешь выборку SELECT, а в лимите указываешь LIMIT $rnd, 1.
Ответ написан
philpirj
@philpirj
Интересно, почему вариант с подселектом COUNT и OFFSET+LIMIT 1 никому в голову не пришёл. Не забудьте из COUNT вычесть единичку перед умножением на rand().
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы