题
作为一个更大的网络应用程序(使用 CakePHP)的一部分,我正在构建一个简单的博客系统。这些关系非常简单:每个用户都有一个博客,其中有许多条目,其中有许多评论。
我想整合的一个元素是“流行条目”的列表。流行的条目被定义为上个月评论最多的条目,最终需要按最近的评论来订购。
理想情况下,我希望解决方案保留在 Cake 模型数据检索装置中(Model->find()
, 等),但我对此并不乐观。
有人有聪明/优雅的解决方案吗?我正在为一些疯狂的 SQL 黑客攻击做好准备,以使这项工作成功......
解决方案
呵呵,我正要返回基本相同的答案(使用 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 数据。
其他提示
应该不会太糟糕,你只需要一个分组依据(这不是我的想法,所以请原谅语法错误):
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”字段来利用 CakePHP 的 counterCache 功能,并配置与此字段关联的 Comment BelongsTo Entry 的 counterCache 键,然后在 Entry 模型上调用 find()。
你可能想要一个 在哪里 获取最近 30 天评论的子句:
SELECT entry-id, count(id) AS c
FROM comment
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id
ORDER BY c DESC
不隶属于 StackOverflow