【问题标题】:CakePHP Query with Result Rank带有结果排名的 CakePHP 查询
【发布时间】: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


【解决方案1】:

也许你可以用这个。

        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 了解更多信息。 :)

【讨论】:

  • 完美。通过传递 where 子句以便我按 ID 查找,然后检索记录及其排名;我得到了我需要的东西。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2015-04-24
  • 2011-11-30
  • 1970-01-01
  • 2011-04-11
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多