Registro aleatorio de la base de datos mysql con CodeIgniter
-
06-07-2019 - |
Pregunta
Investigué por internet, pero no pude encontrar nada ...
Tengo un mysql db, y registros en una tabla, y necesito obtener registros aleatorios de esta tabla en cada carga de página. ¿Cómo puedo hacer eso? ¿Hay alguna función para eso?
¡Aprecio! gracias
CLASIFICADO: enlace: 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 />';
}
Solución
Codeigniter proporciona la capacidad de ordenar sus resultados por "ALEATORIO" cuando ejecuta una consulta. Por ejemplo
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();
}
He usado esto antes y descubrí que funciona bien. Espero que ayude
Otros consejos
No sé sobre codeigniter, pero obtener un conjunto de datos aleatorio es
SELECT * FROM table ORDER BY RAND() LIMIT 1
La parte relevante es " ORDER BY RAND ()
" ;, obviamente.
¿Sabes cuántos registros hay en la tabla? Podrías hacer algo como esto:
$count=mysql_exec('select count(*)-1 from some_table');
$count=rand(1,$count);
entonces:
select * from
some_Table
limit $count,1
Este fragmento de código funcionó bien para mí.
$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();
Obtener un registro aleatorio de una tabla grande es muy costoso.
No utilice ORDER BY RAND ()
.
Esta es una mala idea, pero si tienes una mesa pequeña no hay problema. En una gran base de datos, este tipo de consultas es muy lento.
Yo uso codeigniter con datamapper. Este es el código que utilizo para obtener un registro al azar de la tabla 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
¡La cláusula ORDER BY RAND () devuelve registros aleatorios! Puede limitar los registros también usando LIMIT.
Pensemos que tenemos una tabla donde eliminamos algunas filas. Es posible que la ID no continúe correctamente. Para ID de muestra: 1,5,24,28,29,30,31,32,33 (9 filas)
mysql_num_rows devuelve 9
Otros métodos devolverán filas no existentes: $ cuenta = 9; // porque mysql_num_rows () == 9 $ cuenta = rand (1, $ cuenta); // devuelve 4 para la muestra, pero no hemos remado con id = 4
Pero con mi método siempre obtienes filas existentes. Puede separar el código y usar los primeros 2 códigos en cualquier lugar del sitio.
// 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
Obtener un registro aleatorio de una tabla grande es muy costoso. Pero debajo de este código es muy efectivo ...
$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");
Esto será útil ...
Creo que esta no es la mejor manera. Por ejemplo, ha eliminado el registro que es now == $ count
. Debe iterar esto para mysql_num_rows()
Esta función recupera todas las filas de la tabla en orden aleatorio
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();
}