我正在尝试获取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>
答案 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。 :)