1

作为一个更大的网络应用程序(使用 CakePHP)的一部分,我正在组合一个简单的博客系统。关系非常简单:每个用户都有一个博客,其中有许多条目,有许多评论。

我想加入的一个元素是“热门条目”列表。热门条目被定义为上个月评论最多的条目,最终需要按最近评论的数量排序。

理想情况下,我希望解决方案保留在 Cake 的 Model 数据检索设备(Model->find()等)中,但我对此并不乐观。

有人有聪明/优雅的解决方案吗?我正在为一些疯狂的 SQL hacking 来完成这项工作...

4

4 回答 4

4

嘿,我正要返回基本相同的答案(使用 Cake's Model::find):

$this->loadModel('Comment');

$this->Comment->find( 'all', array(
    'fields' => array('COUNT(Comment.id) AS popularCount'),
    'conditions' => array(
        'Comment.created >' => strtotime('-1 month')
    ),
    'group' => 'Comment.blog_post_id',
    'order' => 'popularCount DESC',

    'contain' => array(
        'Entry' => array(
            'fields' => array( 'Entry.title' )
        )
    )
));

它并不完美,但它可以工作并且可以改进。

我做了一个额外的改进,使用 Containable 行为来提取条目数据而不是评论数据。

于 2008-09-09T20:35:30.157 回答
2

应该不会太糟糕,你只需要一个 group by (这不是我的想法,所以请原谅语法错误):

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment.createdate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
GROUP BY entry-id 
ORDER BY c DESC
于 2008-09-09T20:22:30.033 回答
1

如果您不关心评论的时间敏感性,您可以通过在条目表中添加“comment_count”字段来使用 CakePHP 的 counterCache 功能,配置 Comment belongsTo Entry 关联的 counterCache 键与该字段,然后在 Entry 模型上调用 find()。

于 2008-09-15T20:49:06.970 回答
0

您可能希望WHERE子句仅获得最近 30 天的评论:

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC
于 2008-09-09T20:32:32.380 回答