Попробуйте это:
SELECT category_id, MAX(post_id) AS post_id, COUNT(*) AS posts
FROM post
GROUP BY category_id
Предполагается, что у вас есть столбец post_id
, который строго увеличивается и уникален.
Если у вас нет такого поля, но у вас есть, например, post_date
, который не уникален, вы можете получить две строки для некоторых категорий в тех редких случаях, когда две записи имеют одинаковую метку времени.
Для получения категорий без сообщений используйте левое соединение:
SELECT
category.id AS category_id,
MAX(post.id) AS post_id,
COUNT(post.category_id) AS posts
FROM category
LEFT JOIN post
ON category.id = post.category_id
GROUP BY category.id
Если вам нужно больше столбцов из каждой таблицы, вы можете объединить приведенный выше результат с исходными таблицами:
SELECT *
FROM
(
SELECT
category.id AS category_id,
MAX(post.id) AS post_id,
COUNT(post.category_id) AS posts
FROM category
LEFT JOIN post
ON category.id = post.category_id
GROUP BY category.id
) T1
JOIN category
ON T1.category_id = category.id
LEFT JOIN post
ON T1.post_id = post.id