2009-12-16 106 views
0

我有一个博客,我想找出找到评论最多的帖子的最佳方法。我有一个直接的设置,帖子有很多评论,评论属于帖子。查找最多评论的帖子

我试图找到一个1行“正确的方式”来做到这一点,但无法找到它。我想获得前10名的评论文章。

感谢

回答

3

CakePHP有这个确切的目的counterCache功能。

确保您的职位表中包含一个“COMMENT_COUNT”字段。

然后添加counterCache关键评价模型属于关联后设置。

// app/models/comment.php 
var $belongsTo = array(
    'Post' => array(
    'counterCache' => true 
) 
); 

的CakePHP现在会自动递增/递减Post.comment_count场每次属于该信息的评论中被添加或删除。

要获得前10名最多评论的帖子:

// app/models/post.php 
function getTopCommentedPosts($limit = 10) { 
    return $this->find('all', array(
    'order' => 'Post.comment_count DESC', 
    'limit' => $limit 
)); 
} 

然后调用从需要该数据的任何控制器操作此方法。如果从除PostsController使用其他控制器:

$this->set('posts', ClassRegistry::init('Post')->getTopCommentedPosts()); 
+0

谢谢,这正是我需要的。 – 2010-01-06 15:29:52

0

如果CakePHP会允许你直接使用SQL查询:

SELECT 
    POST.POST_ID 
    COUNT(*) 
FROM 
    POST_TABLE POST 
    INNER JOIN COMMENT_TABLE COMMENT ON COMMENT.POST_ID = POST.POST_ID 
GROUP BY POST.POST_ID 
ORDER BY COUNT(*) 

应该做的伎俩,并很可能会非常有效。

1

你有这个数据库吗?如果是这样,也许你可以使用邮政表中的计算字段来跟踪每篇文章的评论数量。

就用

SELECT TOP 10 FROM Post ORDER BY CommentNumber DESC 
0

我会杂交两种方法,主要是B/C我不知道你的限制或您的主要关注点。不管Adams还是moranu的解决方案都可以工作,尽管有所不同。

如果你有一个大的数据库,并且性能是一个问题,您应该采取第一种方法。每次添加新评论时,都会要求您增加该号码。或者,如果您的网站不需要经常更新前10位的内容,则可以缓存您的“前10条评论性文章”Feed。

我的建议:如果是太难递增CommentNumber场(遗留代码等),你可以运行每小时/每日脚本来更新这个数字对你来说,通过执行第二个查询。我可能会建议你从这些选项中选择适合你的要求的选项。

+0

计算字段是由你为它设置的脚本automaticaly更新,你不需要每次递增它,你插入另一个评论。 – morsanu 2009-12-16 19:49:06

+0

您的意思是计算的字段应该通过每个插入到代码模型中的代码进行更新?我同意这一点。我唯一的意见就是可以在帖子中插入不同的插入点,并且您必须将“为其设置的脚本”附加到提供的钩子上。它仍然不是免费的,不知道确切的情况,我很难评估OP将它添加进去有多困难。 – 2009-12-16 22:47:10

+0

只能将公式附加到数据库中的计算字段。就是这样。 “计算列实际上并未在相关数据库表上物理创建,除非它们被定义为”Persisted“计算列。您可以将计算列视为虚拟列,它们并不物理存储在相关的sql数据库表中。每次在sql语句中引用它们。“ 但是,无论如何,我认为我们在这里与这个计算的现场讨论有点关系:) – morsanu 2009-12-17 07:44:49