Я использую 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/
Я мог бы предложить использовать подзапрос:
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
, но коррелированный подзапрос часто имеет лучшую производительность - особенно с правильными индексами.
Поскольку Гордон, похоже, сейчас оффлайн, я отправлю свое редактирование здесь как еще один ответ. Это должно дать вам заказ, который вы хотите.
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;
Я бы попробовал это
... )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.*
created
статей? Я имею в виду это SQL принтов запроса последние 6 статей, но они находятся в asc
вместо этого , если по desc
Альтернатива Гордон, Вы можете также сделать присоединиться на вложенном запросе, подсчета и группы из 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
);
created
статей? Я имею в виду это SQL принтов запроса последние 6 статей, но они находятся в asc
вместо этого , если по desc
created
статей? Я имею в виду это SQL принтов запроса последние 6 статей, но они находятся вasc
вместо этого , если поdesc
order by
к внешнему запросу, чтобы получить нужный порядок.