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

问题描述:

作为一个更大的Web应用程序(使用CakePHP)的一部分,我正在构建一个简单的博客系统。这些关系非常简单:每个用户都有一个博客,其中有许多条目,其中有很多评论。构建一个复杂的SQL查询(或查询)

我想加入的一个元素是“热门条目”列表。受欢迎的参赛作品被定义为上个月评论最多的参赛作品,最终他们需要根据最近的评论数量进行排序。

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

任何人都有一个聪明/优雅的解决方案?我为自己的一些野生SQL黑客做了这个工作...

嘿,我正要回来以基本相同的答案(使用Cake的型号::找到):

$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行为来提取条目数据而不是评论数据。

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

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 

如果您没有注意到注释的时间敏感性,您可以通过在条目表中添加一个“comment_count”字段,配置Comment belongsTo Entry关联的counterCache键,来利用CakePHP的counterCache功能这个字段,然后在Entry模型上调用find()。