【发布时间】:2011-04-29 13:00:55
【问题描述】:
我正在尝试在我的 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 中记录的“排名”?我正在寻找除“蛮力”解决方案以外的东西,这就是我现在所拥有的。项目的排名会根据它对表中其他记录的执行情况而非常频繁地变化,因此我不能主动存储在表中,因为它可能需要每秒计算一次,甚至几分之一秒。
【问题讨论】:
-
你是如何计算“排名”的?
-
Rank 是 order by 语句中的行“索引”。根据我给出的示例,“some_count”最高的行将为 0,因为 some_count 是由 DESC 排序的。记录按查询排序,但没有该顺序的索引,在我的示例中没有通过循环找到它,或者在 MySQL 查询中将排名作为 MySQL 变量返回。
-
还是有点迷茫——所以“rank”是你表中的一个字段吗?还是基于表中多个字段的计算?
-
Rank 只是该行在 order by 语句中存在的位置。该查询以基于“some_count”和“created”的特定顺序返回表中的所有行,但没有指示该行在数组中的位置的索引。为了找到它的索引,我要么必须遍历 cake 中的数组,就像在我的示例中一样,但更有效的方法是在 MySQL 中,再次在我的示例中,但似乎没有办法使用 CakePHP 执行该查询。
-
明白了。我想下一个问题是——你想如何使用排名?例如 - 对结果进行分页,并在其左侧列出它的“排名”,然后,当您单击时,在其详细信息页面上显示它的“排名”?还是……?
标签: cakephp cakephp-1.3