Случайная запись из базы данных mysql с помощью CodeIgniter
-
06-07-2019 - |
Вопрос
Я поискал в Интернете, но ничего не смог найти...
У меня есть база данных mysql и записи в таблице, и мне нужно получать случайную запись из этой таблицы при каждой загрузке страницы.как я могу это сделать?Есть ли какая-нибудь функция для этого?
Цените!Спасибо
СОРТИРОВАННЫЙ:Ссылка: http://www.derekallard.com/blog/post/ordering-database-results-by-random-in-codeigniter/
$this->db->select('name');
$query = $this->db->get('table');
$shuffled_query = $query->result_array();
shuffle ($shuffled_query);
foreach ($shuffled_query as $row) {
echo $row['name'] . '<br />';
}
Решение
Codeigniter предоставляет возможность упорядочивать ваши результаты "СЛУЧАЙНЫМ образом" при выполнении запроса.Например
function get_random_page()
{
$this->db->order_by('id', 'RANDOM');
or
$this->db->order_by('rand()');
$this->db->limit(1);
$query = $this->db->get('pages');
return $query->result_array();
}
Я использовал это раньше и обнаружил, что это работает нормально.Надеюсь, это поможет
Другие советы
Я не знаю о codeigniter, но получение случайного набора данных - это
SELECT * FROM table ORDER BY RAND() LIMIT 1
Соответствующая часть такова "ORDER BY RAND()
", очевидно.
Знаете ли вы, сколько записей содержится в таблице?Вы могли бы сделать что-то вроде этого:
$count=mysql_exec('select count(*)-1 from some_table');
$count=rand(1,$count);
тогда:
select * from
some_Table
limit $count,1
Этот фрагмент кода хорошо сработал для меня.
$this->db->select('name');
$this->db->order_by('rand()');
$this->db->limit(1);
$query = $this->db->get('<table>'); //<table> is the db table name
return $query->result_array();
Получение случайной записи из большой таблицы обходится очень дорого.Не используйте ORDER BY RAND()
.
Это плохая идея, но если у вас маленький столик, то никаких проблем.В огромных базах данных запросы такого типа выполняются очень медленно.
Я использую codeigniter с datamapper.Это код, который я использую для случайного получения записи из таблицы Advertiser
:
$ad = new Advertiser();
$ad->limit(3);
$ad->order_by('id', 'RANDOM');
$ad->get();
SELECT product_id, title, description
FROM products
WHERE active = 1
AND stock > 0
ORDER BY RAND()
LIMIT 4
Предложение ORDER BY RAND() возвращает случайные записи!Вы также можете ограничить записи, используя LIMIT.
Давайте подумаем, что у нас есть таблица, из которой мы удалили несколько строк.Возможно, идентификатор продолжается некорректно.Для идентификации образца:1,5,24,28,29,30,31,32,33 (9 строк)
mysql_num_rows возвращает 9
Другие методы вернут несуществующие строки:количество долларов=9;//потому что mysql_num_rows()==9 $count=ранд(1,$count);// возвращает 4 для примера, но у нас нет строки с id = 4
Но с помощью моего метода вы всегда получаете существующие строки.Вы можете разделить код и использовать первые 2 кода в любом месте сайта.
// Inside of Controller Class
function _getReal($id,$name_of_table)
{
$Q=$this->db->where('id',$id)->get($name_of_table);
if($Q->num_rows()>0){return $Q;}else{return FALSE;}
}
function _getLastRecord($name_of_table)
{
$Q=$this->db->select("id")->order_by('id DESC')->limit("1")->get($name_of_table)->row_array();
return $Q['id'];
}
function getrandom()
{
$name_of_table="news";
$id=rand(1,$this->_getLastRecord($name_of_table));
if($this->_getReal($id,$name_of_table)!==FALSE)
{
echo $id;
// Here goes your code
}
else
{
$this->getrandom();
}
// END
Получение случайной записи из большой таблицы обходится очень дорого.Но приведенный ниже этот код очень эффективен ..
$count=mysql_num_rows(mysql_query("select * from table_name WHERE SOME_OF_YOUR_CONDITION"));
$nums=rand(1,$count);
mysql_query(" select * from table_name WHERE SOME_OF_YOUR_CONDITION LIMIT $count,1");
Это будет полезно ...
Я думаю, что это не лучший способ.Для примера, вы удалили запись, которая является now==$count
.Вы должны повторить это для mysql_num_rows()
Эта функция извлекает все строки в таблице в случайном порядке
public function get_questions(){
$this->db->select('*');
$this->db->order_by('rand()');
$this->db->from('multiple_choices');
$query = $this->db->get();
return $query->result_array();
}