1

より大きなウェブアプリ(CakePHPを使用)の一部として、私は簡単なブログシステムをまとめています。関係は非常に単純です。各ユーザーには、多くのコメントを持つ多くのエントリがあるブログがあります。

取り入れたい要素は「人気作品」のリストです。人気のあるエントリは、先月のコメント数が最も多いエントリとして定義されており、最終的には最近のコメントの数で並べ替える必要があります。

理想的には、Cakeのモデルデータ取得装置(Model->find()など)内にとどまるソリューションが欲しいのですが、私はこれについて楽観的ではありません。

誰かが賢い/エレガントな解決策を持っていますか?私はこれを機能させるためにいくつかのワイルドなSQLハッキングのために自分自身を鍛えています...

4

4 に答える 4

4

へー、私は本質的に同じ答えを返そうとしていました (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 動作を使用して、コメント データの代わりにエントリ データを抽出することで、さらに改善を加えました。

于 2008-09-09T20:35:30.157 に答える
2

group by が必要なだけです (これは私の頭の型から外れているため、構文エラーを許してください)。

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
于 2008-09-09T20:22:30.033 に答える
1

コメントの時間に敏感な性質に悩まされていない場合は、「comment_count」フィールドをエントリテーブルに追加し、このフィールドとのコメントの属するエントリの関連付けの counterCache キーを構成することで、CakePHP の counterCache 機能を利用できます。 Entry モデルで find() を呼び出します。

于 2008-09-15T20:49:06.970 に答える
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
于 2008-09-09T20:32:32.380 に答える