2008-09-09 97 views
1

作爲一個更大的Web應用程序(使用CakePHP)的一部分,我正在構建一個簡單的博客系統。這些關係非常簡單:每個用戶都有一個博客,其中有許多條目,其中有很多評論。構建一個複雜的SQL查詢(或查詢)

我想加入的一個元素是「熱門條目」列表。受歡迎的參賽作品被定義爲上個月評論最多的參賽作品,最終他們需要根據最近的評論數量進行排序。

理想情況下,我想讓解決方案留在Cake的Model數據檢索設備(Model->find()等)中,但我對此並不樂觀。

任何人都有一個聰明/優雅的解決方案?我爲自己的一些野生SQL黑客做了這個工作...

回答

4

嘿,我正要回來以基本相同的答案(使用Cake的型號::找到):

$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行爲來提取條目數據而不是評論數據。

2

不應該太糟糕,你只需要一個組(由於我的頭型,所以原諒語法錯誤):

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 
0

你可能需要一個WHERE條款得到的只是最近30天的意見:

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

如果您沒有注意到註釋的時間敏感性,您可以通過在條目表中添加一個「comment_count」字段,配置Comment belongsTo Entry關聯的counterCache鍵,來利用CakePHP的counterCache功能這個字段,然後在Entry模型上調用find()。