构造一个复杂的SQL查询(或查询)

时间:2008-09-09 20:18:08

标签: php cakephp

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

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

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

任何人都有一个聪明/优雅的解决方案?我正在为一些疯狂的SQL黑客做好准备以使这项工作......

4 个答案:

答案 0 :(得分:4)

嘿,我刚回来的时候回答基本相同(使用Cake的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行为来提取Entry数据而不是Comment数据。

答案 1 :(得分:2)

不应该太糟糕,你只需要一个组(这是我的头类型,所以原谅语法错误):

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

答案 2 :(得分:1)

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

答案 3 :(得分: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
相关问题