2010-05-06 4 views
1

MySQL DB에서 무작위로 SELECT를 할 필요가 없습니다. 연구를 한 후에 RAND()를 사용하는 것은 나쁜 생각이라고 일반적인 사람들이 말하는 것 같습니다. 다른 유형의 임의 선택을 수행하는 방법을 설명하는 기사를 발견했습니다.Kohana의 MySQL 쿼리에서 RAND()를 사용하지 않기 3

기본적으로 5 개의 무작위 요소를 선택하려면 다음을 수행해야합니다. 여기에서 Kohana 프레임 워크를 사용하고 있습니까?

<?php 
final class Offers extends Model 
{ 
    /** 
    * Loads a random set of offers. 
    * 
    * @param integer $limit 
    * @return array 
    */ 
    public function random_offers($limit = 5) 
    { 
     // Find the highest offer_id 
     $sql = ' 
      SELECT MAX(offer_id) AS max_offer_id 
       FROM offers 
     '; 
     $max_offer_id = DB::query(Database::SELECT, $sql) 
      ->execute($this->_db) 
      ->get('max_offer_id'); 

     // Check to make sure we're not trying to load more offers 
     // than there really is... 
     if ($max_offer_id < $limit) 
     { 
      $limit = $max_offer_id; 
     } 

     $used = array(); 
     $ids = ''; 
     for ($i = 0; $i < $limit;) 
     { 
      $rand = mt_rand(1, $max_offer_id); 
      if (!isset($used[$rand])) 
      { 
       // Flag the ID as used 
       $used[$rand] = TRUE; 

       // Set the ID 
       if ($i > 0) $ids .= ','; 
       $ids .= $rand; 

       ++$i; 
      } 
     } 

     $sql = ' 
      SELECT offer_id, offer_name 
       FROM offers 
      WHERE offer_id IN(:ids) 
     '; 
     $offers = DB::query(Database::SELECT, $sql) 
      ->param(':ids', $ids) 
      ->as_object(); 
      ->execute($this->_db); 

     return $offers; 
    } 
} 

그렇지 않은 경우 더 나은 해결책은 무엇입니까?

+0

예,이 코드의 형식은 Kohana 3입니다. –

+2

처리중인 행의 수는 얼마입니까? RAND()가 나쁘다는 이유로 나를 기사로 연결할 수 있습니까? –

답변

5

offer_id가 순차적이고 모두 연속적이면 해당 접근 방식이 작동합니다. 쿠폰을 제거한 경우 문제가 될 수있는 ID의 갭이있을 수 있습니다.

+0

ID가 누락되었을 때 이런 종류의 방법에 대해 어떻게 생각하세요? –

+3

대신에'$ rand = rand(); SELECT WHERE id = $ rand' (의사 코드), 당신은'$ rand = rand(); SELECT WHERE id> $ rand LIMIT 1'을 입력하십시오. –

+0

아, 그게 좋은 방법이에요. 감사! –

0

큰 테이블 세트의 MySQL rand() 함수에 관해서도 동일한 내용을 읽었지만, 테이블 행을 세고 PHP의 내장 rand (0, count)를 사용하여 더 빨리 수행 할 수 있다고 생각합니다. SELECT에서 가져올 수있는 몇 가지 인덱스 ID를 생성합니다. 나는 그것이 동일한 영향을 미칠 것이지만 모든 성능에 대한 우려가 없다고 생각한다.

관련 문제