使用CodeIgniter从mysql数据库中获取随机记录

33

我在互联网上进行了研究,但没有找到任何东西...

我有一个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 />';
}

$this->db->order_by('rand()'); 是你在代码中添加的行,用于获取随机结果。 - Muhammad Fahad
12个回答

101

当你运行查询时,Codeigniter提供了按“RANDOM”排序结果的功能。例如:

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

}

我以前用过这个,发现它能正常工作。


对于大表格,这个解决方案非常慢!最好的方法是在 PHP 中生成一个随机数,然后在 MySQL 中使用 SELECTWHERE。@RajSar 的方法与此类似。 - Hossein
3
@user57750那个不可靠。如果一些记录损坏或被删除怎么办? - DrewRobertson93

6

我不知道CodeIgniter,但获取随机数据集是很简单的。

SELECT * FROM table ORDER BY RAND() LIMIT 1

相关部分显然是"ORDER BY RAND()"。

嘿,谢谢你的线索,我找到了链接 http://www.derekallard.com/blog/post/ordering-database-results-by-random-in-codeigniter/ :) 太棒了! - designer-trying-coding

4
这个代码片段对我很有效。
$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();

4

你知道这张表里有多少条记录吗?你可以像这样做:

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

然后:

select * from
some_Table
limit $count,1

我认为这是最好的方式,但它应该是Limit $count, 1 吗? - Unreality

3

从大表中获取随机记录非常昂贵。

不要使用ORDER BY RAND()

这是一个糟糕的想法,但如果您有一张小表没有问题。 在一个巨大的数据库中,这种类型的查询非常缓慢。


2
SELECT product_id, title, description
FROM products
WHERE active = 1
AND stock > 0
ORDER BY RAND()
LIMIT 4

ORDER BY RAND() 子句返回随机记录!您也可以使用 LIMIT 限制记录数。

2
我使用CodeIgniter和DataMapper。这是我用来从表Advertiser中随机获取记录的代码:
 $ad = new Advertiser();
 $ad->limit(3);
 $ad->order_by('id', 'RANDOM');
 $ad->get();

1

假设我们有一张表,我们删除了其中的一些行。可能会出现ID不连续的情况。例如:1、5、24、28、29、30、31、32、33(共9行)

mysql_num_rows返回9

其他方法将返回不存在的行: $count=9; //因为mysql_num_rows()==9 $count=rand(1,$count); // 例如返回4,但我们没有id=4的行

但是使用我的方法,您总是可以获得存在的行。您可以分离代码并在网站的任何地方使用前两个代码。

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

1
从大表中获取随机记录非常昂贵。但以下代码非常有效..
$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");

这将是有帮助的...


0

我认为这不是最好的方式。例如,您已经删除了记录,其中 现在== $count。您必须对 mysql_num_rows() 进行迭代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接