Случайный выбор строк с MySQL - PullRequest
1 голос
/ 05 октября 2009

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

Ответы [ 5 ]

5 голосов
/ 05 октября 2009

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

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

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

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

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

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

4 голосов
/ 05 октября 2009

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

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

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

2 голосов
/ 05 октября 2009

У меня есть этот кусок кода в производстве, чтобы получить случайную цитату. Использование функции 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");
2 голосов
/ 05 октября 2009

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

2 голосов
/ 05 октября 2009

вам нужен запрос, подобный этому:

SELECT * 
FROM tablename
WHERE somefield='something'
ORDER BY RAND() LIMIT 3

взято из второго результата http://www.google.com/search?q=mysql+random и это должно работать;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...