2009-10-26 33 views
20

tôi nghiên cứu trên internet, nhưng không thể tìm thấy bất cứ điều gì ...kỷ lục ngẫu nhiên từ cơ sở dữ liệu mysql với CodeIgniter

Tôi có một db mysql, và hồ sơ ở một cái bàn, và tôi cần phải nhận kỷ lục ngẫu nhiên từ bảng này ở mọi tải trang. Làm thế nào tôi có thể làm điều đó? Có func nào không?

Đánh giá cao! nhờ


SẮP XẾP THEO: liên kết: 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()'); là dòng mà bạn thêm vào mã của bạn để có được kết quả ngẫu nhiên –

Trả lời

70

CodeIgniter cung cấp khả năng đặt kết quả của bạn bằng cách 'ngẫu nhiên' khi bạn chạy một truy vấn. Ví dụ:

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

} 

Tôi đã sử dụng trước đây và thấy nó hoạt động tốt. Hy vọng rằng sẽ giúp

+0

woa cool! cảm ơn!!! –

+0

cho bảng lớn, giải pháp này rất chậm! phương pháp tốt nhất là tạo ra một số ngẫu nhiên trong php và 'SELECT' và' WHERE' trong mysql. Phương pháp của @RajSar là simular này. – Hossein

+2

@ user57750 không đáng tin cậy. Điều gì xảy ra nếu một số hồ sơ bị hỏng hoặc đã bị xóa? – DrewRobertson93

6

Tôi không biết về codeigniter, nhưng nhận được một tập dữ liệu ngẫu nhiên là

SELECT * FROM table ORDER BY RAND() LIMIT 1 

Phần liên quan là "ORDER BY RAND()", chắc chắn.

+0

hey cảm ơn, từ đầu mối của bạn, tôi tìm thấy liên kết http://www.derekallard.com/blog/post/ordering-database-results-by-random-in -codeigniter/:) được sắp xếp! –

3

Bạn có biết có bao nhiêu bản ghi trong bảng không? Bạn có thể làm một cái gì đó như thế này:

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

thì:

select * from 
some_Table 
limit $count,1
+0

Tôi nghĩ rằng đây là cách tốt nhất, nhưng nó có nên là giới hạn $ count, 1? – Unreality

+0

@ Unreality: Vâng, bạn nói đúng. Tôi sẽ chỉnh sửa và sửa nó. – FrustratedWithFormsDesigner

0

Tôi nghĩ đây không phải là cách tốt nhất. Đối với mẫu, bạn đã xóa bản ghi là now==$count. Bạn phải lặp lại điều này cho mysql_num_rows()

1

Cho phép nghĩ rằng chúng tôi có bảng nơi chúng tôi đã xóa một số hàng. Có thể ID không tiếp tục chính xác. Đối với id mẫu: 1,5,24,28,29,30,31,32,33 (9 hàng)

mysql_num_rows trả 9

phương pháp khác sẽ trở lại không hàng hiện có: $ count = 9; // vì mysql_num_rows() == 9 $ count = rand (1, $ count); // trả về 4 cho mẫu, nhưng chúng tôi không có hàng với id = 4

Nhưng với phương pháp của tôi, bạn luôn nhận được các hàng hiện có. Bạn có thể tách mã và sử dụng 2 mã đầu tiên ở bất kỳ đâu trên trang web.

// 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

Nhận bản ghi ngẫu nhiên từ bảng lớn rất tốn kém. Không sử dụngORDER BY RAND().

Đây là một ý tưởng tồi, nhưng nếu bạn có một bảng nhỏ không có vấn đề gì. Trong cơ sở dữ liệu khổng lồ, loại truy vấn này rất chậm.

2

Tôi sử dụng trình mã hóa với bộ dữ liệu. Đây là mã mà tôi sử dụng để có được một kỷ lục một cách ngẫu nhiên từ bảng Advertiser:

$ad = new Advertiser(); 
$ad->limit(3); 
$ad->order_by('id', 'RANDOM'); 
$ad->get(); 
1

Bắt kỷ lục ngẫu nhiên từ bảng lớn là rất tốn kém. Nhưng dưới đây mã này rất hiệu quả ..

$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"); 

này sẽ rất hữu ích ...

4

Đoạn mã này làm việc tốt cho tôi.

$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

Chức năng này lấy tất cả các hàng trong bảng theo thứ tự ngẫu nhiên

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 

Các ORDER BY RAND() trả về khoản ghi ngẫu nhiên! Bạn có thể giới hạn các bản ghi cũng sử dụng LIMIT.

Các vấn đề liên quan