CakePHP-запрос с рейтингом результата - PullRequest
1 голос
/ 29 апреля 2011

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

1 Ответ

2 голосов
/ 29 апреля 2011

может быть, вы могли бы использовать это.

        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 для получения дополнительной информации.:)

...