关于php:构造一个复杂的SQL查询(或多个查询)

关于php:构造一个复杂的SQL查询(或多个查询)

construct a complex SQL query (or queries)

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

我要合并的元素是"热门条目"的列表。热门条目的定义是上个月评论最多的条目,最终需要按编号的顺序进行排序最近的评论。

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

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


嘿,我正要回来的时候基本上是相同的答案(使用Cake的Model :: find):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$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
3
4
5
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


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


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

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

推荐阅读