2011-04-29 106 views
1

我想在我的CakePHP應用程序中獲得記錄的「排名」,並且在數據庫端遇到問題。我知道我可以用這樣一個例子來獲得該項目排名與SQL查詢...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 

我最初試圖使用模型查詢功能來執行這項任務,但是當我試圖把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"); 

這似乎是比我目前在做的CakePHP,這是越來越由「some_count」,然後通過他們循環,直到我有結果訂購的所有記錄的列表更有效的方法。我的表可能會增長到數百萬條記錄,所以在應用程序服務器上這將非常快速地變得非常艱難。

$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 2011-04-29 13:15:32

+0

Rank是按語句順序排列的「索引」。根據我給出的示例,具有最高「some_count」的行將爲0,因爲some_count是由DESC定購的。記錄是按查詢排序的,但是如果沒有通過我的示例中的循環找到它,或者沒有在MySQL查詢中將排名作爲MySQL變量返回,那麼沒有該順序的索引。 – 2011-04-29 13:19:45

+0

仍然有一種失落 - 所以「等級」是你的表中的一個領域?或者它是基於表中多個字段的計算? – Dave 2011-04-29 13:27:29

回答

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查找,然後檢索記錄及其等級;我得到了我需要的東西。非常感謝! – 2011-04-29 13:47:50