2008-09-09 19 views
1

大きなWebアプリケーション(CakePHPを使用)の一部として、私は簡単なブログシステムを組み立てています。関係は非常に単純です:各ユーザーは多くのコメントを持つ多くのエントリーを持つブログを持っています。複雑なSQLクエリ(またはクエリ)を構築する

私が組み込みたい要素は、「人気のあるエントリー」のリストです。人気のあるエントリは、先月のコメントが最も多いものとして定義されています。最終的には、最近のコメントの数で注文する必要があります。

理想的には、解決策をCake's Modelのデータ検索装置(Model->find()など)内にとどめたいのですが、これについては心配していません。

誰もが賢明で優雅な解決策を持っていますか?私はこの仕事をするためにいくつかの野生のSQLハッキングのために頑張っています...

答えて

4

へぇを:::

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 
2

あなたはグループを必要とします(これは私の頭のタイプではありませんので、構文エラーを許してください): 、私は(Cakeのモデルを使用して、本質的に同じ答えに戻ってきてちょうど約た

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

おそらく句がちょうど過去30日間のコメントを取得したいです見つける):

$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ビヘイビアを使用して、さらに改善しました。

1

コメントの時間を敏感な性質に悩まされていない場合は、「comments_count」フィールドをエントリテーブルに追加し、Comment belongsTo EntryアソシエーションのcounterCacheキーを設定してCakePHPのcounterCache機能を使用することができますこのフィールドは、Entryモデルでfind()を呼び出します。