2011-04-29 3 views
1

내 CakePHP 애플리케이션에서 레코드의 "순위"를 얻으려고하고 있는데 데이터베이스가 끝날 때 문제가 있습니다. 나는 결과 순위가있는 CakePHP 쿼리

SET @rownum := 0; 
SELECT rank, id FROM (
     SELECT @rownum := @rownum + 1 AS rank, id 
     FROM item_table ORDER BY some_count DESC 
     ) as result WHERE id=xxxxxxxx 

내가 처음이 작업을 수행하기 위해 모델 쿼리 기능을 사용하려고 ... 나는 SQL 쿼리와 함께 항목의 순위를 얻기 위해이 같은 예를 사용할 수 있습니다 알고 있지만, 내가하려고 할 때 CakePHP의에서 오류가 발생합니다 다중 명령문 쿼리를 사용하십시오.

$rank = $this->Item->query("SET @rownum := 0; SELECT rank, id FROM (SELECT @rownum := @rownum + 1 AS rank, id FROM item_table ORDER BY some_count DESC) as result WHERE id=xxxxxxxx"); 

이 나는 ​​현재 내가 결과를 얻을 때까지 그들을 통해 반복 다음 "some_count"을 주문한 모든 레코드의 목록을 받고있는 CakePHP의에서 뭐하는 거지보다 더 효율적인 방법이 될 것으로 보인다. 내 테이블은 수백만 개의 레코드로 커질 수 있으므로 응용 프로그램 서버에서 매우 빠르게 심하게 될 것입니다.

$itemList = $this->Item->find(
     'list', 
     array(
      'conditions' => array(
       'Item.hidden' => 0 
      ), 
      'order' => array(
       'Item.some_count DESC', 
       'Item.created DESC' 
      ), 
      'fields' => array(
       'Item.id' 
      ) 
     ) 
    ); 

    $rank; 
    $i = 1; 
    foreach($itemList as $j){ 
     if($j == $currItem['Item']['id']){ 
      $rank = $i; 
      break; 
     } 
     $i++; 
    } 
    $this->set('itemRank', $rank); 

CakePHP에서 레코드의 "순위"를 효율적으로 얻는 방법이 있습니까? 나는 내가 지금 가지고있는 "무차별 대용"솔루션이 아닌 다른 것을 찾고있다. 항목의 순위는 테이블의 다른 레코드에 대해 수행되는 방식에 따라 매우 자주 변경되므로 테이블에 적극적으로 저장할 수있는 것이 아니므로 초당 계산해야하거나 초 단위로 계산해야 할 수도 있습니다.

+0

"계급"은 어떻게 계산합니까? – Dave

+0

Rank는 order by 문에서 "index"행입니다. 필자가 제시 한 샘플을 기반으로 some_count가 DESC에 의해 정렬되기 때문에 가장 높은 "some_count"를 가진 행은 0이 될 것입니다. 레코드는 쿼리에 의해 정렬되지만 예제의 루프를 통해 찾거나 MySQL 쿼리에서 MySQL 변수로 순위를 반환하지 않고는 해당 순서의 인덱스가 없습니다. –

+0

아직도 잃어버린 종류 - 그래서 "계급"은 당신의 테이블에있는 필드입니까? 또는 테이블의 여러 필드를 기반으로 한 계산입니까? – Dave

답변

2

사용할 수 있습니다.

 SELECT id, some_count, FIND_IN_SET(
            some_count 
           , (SELECT GROUP_CONCAT(
            DISTINCT some_count 
            ORDER BY some_count DESC 
           ) 
          FROM item_table) 
          ) as rank 
     FROM item_table; 

cakephp query() 기능을 사용합니다.

자세한 내용은 mysql rank trip을 참조하십시오. :)

+0

완벽. where 절을 전달하여 ID로 찾으면 레코드와 순위가 검색됩니다. 나는 내가 필요한 것을 정확하게 얻는다. 많이 고마워! –