Я пытаюсь получить «ранг» записи в моем приложении 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? Я ищу что-то другое, чем решение "грубой силы", которое у меня сейчас. Ранг элемента будет меняться очень часто в зависимости от того, как он работает с другими записями в таблице, поэтому я не могу активно хранить его в таблице, поскольку его, вероятно, нужно будет вычислять каждую секунду или даже доли секунды.