создайте сложный SQL-запрос (или запросы)

StackOverflow https://stackoverflow.com/questions/52806

  •  09-06-2019
  •  | 
  •  

Вопрос

Как часть более крупного веб-приложения (использующего 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top