web-dev-qa-db-ja.com

CodeIgniterを使用したmysqlデータベースからのランダムレコード

インターネットで調べましたが、何も見つかりませんでした...

Mysql dbとテーブルにレコードがあり、ページがロードされるたびにこのテーブルからランダムなレコードを取得する必要があります。どうやってやるの?そのための機能はありますか?

感謝する!ありがとう


ソート:リンク: 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();

}

以前にこれを使用したことがありますが、正常に機能することがわかりました。役立つことを願っています

90

Codeigniterについては知りませんが、ランダムデータセットの取得は

_SELECT * FROM table ORDER BY Rand() LIMIT 1
_

関連部分は、明らかに「ORDER BY Rand()」です。

6
ty812

このコードスニペットは私にとってはうまく機能しました。

$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
Dipanwita Das

テーブルにあるレコードの数を知っていますか?次のようなことができます:

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

その後:

select * from
some_Table
limit $count,1

大きなテーブルからランダムなレコードを取得するのは非常に高価です。 使用しないORDER BY Rand()

これは悪い考えですが、小さなテーブルがあれば問題ありません。巨大なデータベースでは、このタイプのクエリは非常に遅くなります。

3
vchakoshy

Codemignerをdatamapperで使用します。これは、テーブルAdvertiserからレコードをランダムに取得するために使用するコードです。

 $ad = new Advertiser();
 $ad->limit(3);
 $ad->order_by('id', 'RANDOM');
 $ad->get();
2
chantheoun
SELECT product_id, title, description
FROM products
WHERE active = 1
AND stock > 0
ORDER BY Rand()
LIMIT 4

ORDER BY Rand()句はランダムなレコードを返します! LIMITを使用してレコードを制限することもできます。

2
Sugan Krishna

いくつかの行を削除したテーブルがあるとしましょう。 IDが正しく継続していない可能性があります。サンプル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で行を処理しません

しかし、私の方法では、常に既存の行を取得します。コードを分離し、サイトのどこでも最初の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
1
SNabi

大きなテーブルからランダムなレコードを取得するのは非常に高価です。しかし、このコードは非常に効果的です..

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

これは役に立ちます...

1
RajSar

これは最善の方法ではないと思います。サンプルでは、​​_now==$count_であるレコードを削除しました。 mysql_num_rows()に対してこれを繰り返す必要があります

0
Samir

この関数は、テーブル内のすべての行をランダムな順序で取得します

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