2009-10-26 88 views
20

Me investigado en internet, pero no pudo encontrar nada ...registro aleatorio de la base de datos MySQL con CodeIgniter

Tengo una base de datos mysql, y los registros en una mesa, y necesito para obtener registro aleatorio de esta tabla en cada carga de página. ¿Cómo puedo hacer eso? ¿Hay algún func para eso?

¡Apreciar! gracias


Ordenada: 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 />'; 
} 
+0

$ this-> db-> order_by ('rand()'); es la línea que agrega a su código para obtener resultados aleatorios –

Respuesta

70

CodeIgniter proporciona la capacidad de ordenar los resultados por 'al azar' cuando se 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 he encontrado que funciona bien. Espero que ayude

+0

woa cool! ¡¡¡Gracias!!! –

+0

para una mesa grande, ¡esta solución es muy lenta! El mejor método es generar un número aleatorio en php y 'SELECT' y' WHERE' en mysql. El método de @RajSar es similar a esto. – Hossein

+2

@ user57750 que no es confiable. ¿Qué pasa si algunos de los registros están corruptos o han sido eliminados? – DrewRobertson93

6

que no saben de CodeIgniter, pero conseguir un conjunto de datos aleatorios es

SELECT * FROM table ORDER BY RAND() LIMIT 1 

La parte pertinente es "ORDER BY RAND()", obviamente.

+0

hey gracias, de su pista, encontré el enlace http://www.derekallard.com/blog/post/ordering-database-results-by-random-in -codeigniter/:) ordenados! –

3

¿Sabes cuántos registros hay en la tabla? Se podría hacer algo como esto:

$count=mysql_exec('select count(*)-1 from some_table'); 
$count=rand(1,$count);

a continuación:

select * from 
some_Table 
limit $count,1
+0

Creo que esta es la mejor manera, pero ¿debería ser Limit $ count, 1? – Unreality

+0

@Urrealidad: Sí, tienes razón. Voy a editar y corregir eso. – FrustratedWithFormsDesigner

0

Creo que esta no es la mejor manera. Para la muestra, ha eliminado el registro que es now==$count. Debe iterar esto para mysql_num_rows()

1

Supongamos que tenemos una tabla donde hemos eliminado algunas filas. Tal vez la ID no continúe correctamente. Por ID de la muestra: 1,5,24,28,29,30,31,32,33 (9 filas)

mysql_num_rows devuelve 9

Otros métodos no volverán filas existentes: $ count = 9; // porque mysql_num_rows() == 9 $ count = rand (1, $ count); // devuelve 4 para la muestra, pero no hemos remar con id = 4

Pero con mi método siempre se obtienen las 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 
3

Obtener un registro aleatorio de una tabla grande es muy costoso. No utilizarORDER BY RAND().

Esta es una mala idea, pero si tiene una mesa pequeña, no hay problema. En una gran base de datos, este tipo de consultas son muy lentas.

2

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(); 
1

Conseguir registro aleatorio de mesa es muy caro. 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 ...

4

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(); 
0

Esta función recuperar 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(); 
} 
3
SELECT product_id, title, description 
FROM products 
WHERE active = 1 
AND stock > 0 
ORDER BY RAND() 
LIMIT 4 

El ORDER BY RAND() cláusula devuelve registros al azar! Puede limitar los registros también usando LIMIT.

Cuestiones relacionadas