SQL: как получить количество просмотров из нескольких статей, отсортированных по категориям?

0

Я использую MySQL, и у меня есть код, который получает последние 6 статей из каждой категории:

select a.*
from article a
where a.created >= coalesce((select a2.created
   from article a2
   where a2.category = a.category
   order by a2.created desc
   limit 5, 1
  ), a.created
 );

Теперь мне также нужно получить общее представление для каждой статьи из другой таблицы. Как это сделать? Это не работает:

select a.*, Count(view.*) as CountViews
from article a
where a.created >= coalesce((select a2.created
   from article a2
   where a2.category = a.category
   order by a2.created desc
   limit 5, 1
  ), a.created
 ) left join view on a.id = view.post_id;

Пример печати статей по категориям: https://nedvigimostmsk.ru/

Теги:

4 ответа

1
Лучший ответ

Я мог бы предложить использовать подзапрос:

select a.*,
       (select count(*)
        from views v
        where a.id = v.post_id
       ) as num_views
from article a
where a.created >= coalesce((select a2.created
                             from article a2
                             where a2.category = a.category
                             order by a2.created desc
                             limit 5, 1
                            ), a.created
                           );

Проблема с вашим запросом заключается в том, что вы используете COUNT() без GROUP BY. Либо это возвращает ошибку (с настройкой по умолчанию в более поздних версиях MySQL), либо возвращает одну загадочную строку. Вы можете исправить это с помощью GROUP BY, но коррелированный подзапрос часто имеет лучшую производительность - особенно с правильными индексами.

  • 0
    Спасибо! Не могли бы вы также посоветовать, как изменить сортировку created статей? Я имею в виду это SQL принтов запроса последние 6 статей, но они находятся в asc вместо этого , если по desc
  • 0
    @Sirjay. , , Вы можете добавить order by к внешнему запросу, чтобы получить нужный порядок.
2

Поскольку Гордон, похоже, сейчас оффлайн, я отправлю свое редактирование здесь как еще один ответ. Это должно дать вам заказ, который вы хотите.

    select a.*,
           (select count(*)
            from views v
            where a.id = v.post_id
           ) as num_views
    from article a
    where a.created >= coalesce((select a2.created
                                 from article a2
                                 where a2.category = a.category
                                 order by a2.created desc
                                 limit 5, 1
                                ), a.created
                               )
ORDER BY a.created DESC;
0

Я бы попробовал это

... )left join view on a.id = view.post_id 
GROUP BY a.*

Кроме того, в инструкции SELECT используйте это вместо COUNT (view. *) AS CountViews

COUNT(view.post_id) AS CountViews

Вообще говоря, лучше перечислять конкретные столбцы, которые вы хотите вернуть, а не просто использовать SELECT a.*

  • 0
    Спасибо! Не могли бы вы также посоветовать, как изменить сортировку created статей? Я имею в виду это SQL принтов запроса последние 6 статей, но они находятся в asc вместо этого , если по desc
0

Альтернатива Гордон, Вы можете также сделать присоединиться на вложенном запросе, подсчета и группы из views таблицы

select a.*, v.cnt as total_views
from article a
inner join 
    (
        select post_id, count(*) as cnt from views group by post_id
    ) v on a .id = v.post_id
where a.created >= coalesce((select a2.created
   from article a2
   where a2.category = a.category
   order by a2.created desc
   limit 5, 1
  ), a.created
 );
  • 0
    Спасибо! Не могли бы вы также посоветовать, как изменить сортировку created статей? Я имею в виду это SQL принтов запроса последние 6 статей, но они находятся в asc вместо этого , если по desc

Ещё вопросы

Сообщество Overcoder
Наверх
Меню