создайте сложный SQL-запрос (или запросы)
Вопрос
Как часть более крупного веб-приложения (использующего CakePHP), я создаю простую систему ведения блога.Эти отношения чрезвычайно просты:у каждого Пользователя есть Блог, в котором много Записей, к которым много Комментариев.
Элемент, который я хотел бы включить, - это список "Популярных записей". Популярные записи были определены как записи с наибольшим количеством комментариев за последний месяц, и в конечном итоге их нужно упорядочить по количеству последних комментариев.
В идеале я бы хотел, чтобы решение оставалось в рамках модельного устройства поиска данных Cake (Model->find()
, и т.д.), но я не настроен оптимистично по этому поводу.
У кого-нибудь есть умное / элегантное решение?Я готовлю себя к какому-нибудь дикому взлому SQL, чтобы это сработало...
Решение
Хех, я как раз собирался вернуться с практически тем же ответом (используя модель Cake::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' )
)
)
));
Это не идеально, но это работает и может быть улучшено.
Я внес дополнительное улучшение, используя сдерживаемое поведение для извлечения входных данных вместо данных комментария.
Другие советы
Должно быть не так уж плохо, вам просто нужна 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
Если бы вас не беспокоил чувствительный ко времени характер комментариев, вы могли бы воспользоваться функциональностью кэширования CakePHP, добавив поле "comment_count" в таблицу entries, настроив ключ кэширования для ассоциации Comment belongsTo Entry с этим полем, а затем вызвать find() в модели Entry .
Вы, вероятно, хотите ГДЕ условие для получения комментариев только за последние 30 дней:
SELECT entry-id, count(id) AS c
FROM comment
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id
ORDER BY c DESC