построить сложный SQL-запрос (или запросы) - PullRequest
1 голос
/ 10 сентября 2008

В рамках более крупного веб-приложения (использующего CakePHP) я создаю простую систему блогов. Отношения чрезвычайно просты: у каждого пользователя есть блог, в котором есть много записей, в которых много комментариев.

Элемент, который я хотел бы включить, - это список «Популярные записи». Популярные записи были определены как записи с наибольшим количеством комментариев за последний месяц, и в конечном итоге их необходимо упорядочить по количеству последних комментариев.

В идеале, я бы хотел, чтобы решение оставалось в устройстве извлечения данных Модели Cake (Model->find() и т. Д.), Но я не уверен в этом.

У кого-нибудь есть умное / элегантное решение? Я готовлюсь к дикому взлому SQL, чтобы заставить эту работу ...

Ответы [ 4 ]

4 голосов
/ 10 сентября 2008

Хех, я как раз собирался вернуться с практически таким же ответом (используя Cake's 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 для извлечения данных Entry вместо данных Comment.

2 голосов
/ 10 сентября 2008

Не должно быть слишком плохо, вам просто нужна группа по (это не в моей голове, так что простите за синтаксические ошибки):

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
1 голос
/ 16 сентября 2008

Если вы не беспокоились о чувствительном ко времени характере комментариев, вы можете использовать функцию counterCache в CakePHP, добавив поле «comment_count» в таблицу записей, сконфигурировав ключ counterCache ассоциации Comment ownTo Entry с этим затем вызовите find () для модели Entry.

0 голосов
/ 10 сентября 2008

Возможно, вы хотите, чтобы предложение WHERE получило только последние 30 дней комментариев:

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...