CakePHP查询结果排名

时间:2011-04-29 13:00:55

标签: cakephp cakephp-1.3

我正在尝试获取CakePHP应用程序中记录的“等级”,而我在数据库端无法做到这一点。我知道我可以使用这样的示例来获取带有SQL查询的项目排名......

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中记录的“排名”?我正在寻找除“蛮力”解决方案之外的其他东西,这就是我现在所拥有的。项目的排名将根据它对表中其他记录的执行情况而非常频繁地变化,因此它不是我可以主动存储在表中的东西,因为它可能需要每秒计算一次,甚至几分之一秒。< / p>

1 个答案:

答案 0 :(得分: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。 :)