CodeIgniter가있는 MySQL 데이터베이스의 랜덤 레코드
-
06-07-2019 - |
문제
인터넷을 통해 조사했지만 아무것도 찾을 수 없었습니다 ...
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는 쿼리를 실행할 때 '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();
}
나는 이것을 전에 사용했고 잘 작동하는 것을 발견했습니다. 도움이되기를 바랍니다
다른 팁
CodeIgniter에 대해 잘 모르겠지만 임의의 데이터 세트를 얻는 것은
SELECT * FROM table ORDER BY RAND() LIMIT 1
관련 부분은 "ORDER BY RAND()
", 확실히.
테이블에 얼마나 많은 레코드가 있는지 알고 있습니까? 당신은 다음과 같은 일을 할 수 있습니다 :
$count=mysql_exec('select count(*)-1 from some_table');
$count=rand(1,$count);
그 다음에:
select * from
some_Table
limit $count,1
이 코드 스 니펫은 저에게 잘 작동했습니다.
$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();
큰 테이블에서 임의의 레코드를 얻는 것은 매우 비쌉니다.사용하지 마십시오 ORDER BY RAND()
.
이것은 나쁜 생각이지만 작은 테이블이 있다면 문제가 없습니다. 거대한 데이터베이스에서 이러한 유형의 쿼리는 매우 느립니다.
Datamapper와 함께 CodeInter를 사용합니다. 테이블에서 무작위로 레코드를 얻는 데 사용하는 코드입니다. 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
rand () 조항에 의한 주문은 랜덤 레코드를 반환합니다! 한도를 사용하여 레코드를 제한 할 수 있습니다.
행을 삭제 한 테이블이 있다고 생각합시다. ID가 올바르게 계속되지 않을 수 있습니다. 샘플 ID : 1,5,24,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
큰 테이블에서 임의의 레코드를 얻는 것은 매우 비쌉니다. 그러나이 코드는 매우 효과적입니다 ..
$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");
도움이 될 것입니다 ...
나는 이것이 최선의 방법이 아니라고 생각합니다. 샘플의 경우 레코드를 삭제했습니다 now==$count
. 당신은 이것을 반복해야합니다 mysql_num_rows()
이 기능은 테이블의 모든 행을 임의 순서로 검색합니다.
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();
}