문제

더 큰 웹앱(CakePHP 사용)의 일부로 간단한 블로그 시스템을 구성하고 있습니다.관계는 매우 간단합니다.각 사용자는 많은 항목과 댓글이 있는 블로그를 가지고 있습니다.

내가 포함하고 싶은 요소는 "인기있는 항목"목록입니다. 인기있는 출품작은 지난 달에 가장 많은 의견을 가진 입장으로 정의되었으며 궁극적으로 최근 의견 수에 따라 주문해야합니다.

이상적으로는 Cake의 모델 데이터 검색 장치(Model->find(), 등), 그러나 나는 이것에 대해 낙관적이지 않습니다.

영리하고 우아한 솔루션을 갖고 있는 사람이 있나요?나는 이 작업을 수행하기 위해 거친 SQL 해킹에 대비하고 있습니다.

도움이 되었습니까?

해결책

허, 나는 본질적으로 동일한 대답을 가지고 돌아오려고 했습니다(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' )
        )
    )
));

완벽하지는 않지만 작동하고 개선될 수 있습니다.

Comment 데이터 대신 Entry 데이터를 추출하기 위해 Containable 동작을 사용하여 추가 개선을 이루었습니다.

다른 팁

별로 나쁘지는 않습니다. 그룹이 필요합니다. (이것은 내 머리 유형과 다르므로 구문 오류를 용서하십시오):

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 presentsTo Entry 연관의 counterCache 키를 구성함으로써 CakePHP의 counterCache 기능을 활용할 수 있습니다. Entry 모델에서 find()를 호출합니다.

당신은 아마 어디 지난 30일 동안의 의견을 가져오는 조항:

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top