作为一个更大的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 |