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

时间:2020-03-05 18:50:19  来源:igfitidea点击:

作为一个较大的Web应用程序(使用CakePHP)的一部分,我正在构建一个简单的博客系统。关系非常简单:每个用户都有一个Blog,其中包含许多条目,其中包含许多评论。

我要合并的元素是"热门条目"列表。流行条目已被定义为上个月评论数量最多的条目,最终需要根据最近评论的数量对其进行排序。

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

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

解决方案

回答

应该还不错,我们只需要一个分组依据(这是我的主意,因此可以原谅语法错误):

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

回答

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

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC

回答

嘿,我将要返回的答案基本上是相同的(使用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数据。

回答

如果我们对注释的时间敏感性本质不感到困惑,则可以通过在条目表中添加" comment_count"字段,并在此字段中配置Comment AboutTo Entry关联的counterCache键,来使用CakePHP的counterCache功能。在Entry模型上调用find()。