代码之家  ›  专栏  ›  技术社区  ›  Daniel Wright

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

  •  1
  • Daniel Wright  · 技术社区  · 16 年前

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

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

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

    有人有聪明/优雅的解决方案吗?我正在努力尝试一些疯狂的SQL黑客攻击来实现这一目标…

    4 回复  |  直到 9 年前
        1
  •  4
  •   Daniel Wright    16 年前

    呵呵,我刚要回来的时候,回答基本上是一样的(使用cake的模型::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' )
            )
        )
    ));
    

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

    我做了一个额外的改进,使用可包含的行为来提取条目数据,而不是注释数据。

        2
  •  2
  •   jodonnell    16 年前

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

    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
    
        3
  •  1
  •   neilcrookes    16 年前

    如果您不担心注释的时间敏感性,可以使用cakephp的反缓存功能,方法是在entries表中添加一个“comment_count”字段,将注释的反缓存键配置为与该字段关联的条目,然后在条目模型上调用find()。

        4
  •  0
  •   A J    9 年前

    你可能想要一个 哪里 条款获取最近30天的评论:

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