SQL: как получить количество просмотров из нескольких статей, отсортированных по категориям? - PullRequest
0 голосов
/ 05 июля 2018

Я использую 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 ]

0 голосов
/ 05 июля 2018

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

    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 голосов
/ 05 июля 2018

Альтернатива Гордону. Вы также можете объединить вложенный запрос, который считает и группирует из таблицы 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 голосов
/ 05 июля 2018

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

... )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 голосов
/ 05 июля 2018

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

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, но коррелированный подзапрос часто имеет лучшую производительность - особенно с правильными индексами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...