2009-10-04 4 views
1

Для случайного выбора записей из одной таблицы; я должен всегда устанавливать временную переменную в PHP? Мне нужна помощь в выборе случайных строк в модели CodeIgniter, а затем отображать три разных вида в представлении каждый раз, когда просматривается моя домашняя страница. У кого-нибудь есть мысли о том, как решить эту проблему? Заранее спасибо!Случайный выбор строк с помощью MySQL

ответ

2

У меня есть эта часть кода в производстве, чтобы получить случайную цитату. Использование функции RAND в MySQL было очень медленным. Даже с 100 котировками в базе данных я заметил время ожидания на веб-сайте. С этим не было никакого отставания.

$result = mysql_query('SELECT COUNT(*) FROM quotes'); 
$count = mysql_fetch_row($result); 
$id = rand(1, $count[0]); 
$result = mysql_query("SELECT author, quote FROM quotes WHERE id=$id"); 
4

Я хотел бы сделать что-то вроде:

SELECT * FROM table ORDER BY RAND() LIMIT 1; 

Это поместит данные в случайном порядке, а затем возвращает только первую строку из этой случайной последовательности.

5

Если вы не имеете тонну строк, вы можете просто:

SELECT * FROM myTable ORDER BY RAND() LIMIT 3; 

Если у вас есть много строк, это будет получить медленно, но для наборов данных меньше он будет работать нормально.

Как говорит Стив Мишель в своем ответе, этот метод может стать очень уродливым для больших столов. Его предложение - хорошее место, чтобы спрыгнуть. Если вы знаете приблизительное максимальное целое число ПК на столе, вы можете сделать что-то вроде генерации случайного числа от одного до вашего значения макс ПК, а затем захватить случайные ряды друг в то время как:

$q="SELECT * FROM table WHERE id >= {$myRandomValue}"; 
$row = $db->fetchOne($q); //or whatever CI's interface to grab a single is like 

Конечно, если вам нужно 3 случайных строки, у вас будет три запроса здесь, но поскольку они полностью на ПК, они будут быстрыми (чем рандомизация всей таблицы).

2

Заказ большой стол по RAND() может быть очень дорого, если таблица очень большая. MySQL должен будет создать временную таблицу и отсортировать ее. Если у вас есть первичный ключ, и вы знаете, сколько строк в таблице, используйте LIMIT x, 1, чтобы захватить случайную строку, где x - номер строки, которую вы хотите получить.

Смежные вопросы