Count записей в категории

Нужно было для своего нового проекта выполнить запрос, который возвращал-бы список категорий и количество записей в категории.
база данных состоит из двух таблиц:
1. Категории (id, имя);
2. Записи (id, id категории, текст).

Нашел в интернете целый ряд примеров запросов:

SELECT categories.*, COUNT(posts.id)
FROM categories, posts
WHERE categories.id=posts.id
SELECT categories.id,
 (SELECT count(*) from posts WHERE id=categories.id) as cnt
FROM categories
SELECT categories.id, COUNT( * )
FROM categories
LEFT JOIN posts ON ( posts.id )
GROUP BY categories.id
SELECT t.id, COUNT(p.id) as cnt
FROM
 categories as t LEFT OUTER JOIN
 posts as p ON t.id=p.id
GROUP BY t.id
SELECT t.*, COUNT(p.category_id) AS cnt
FROM categories as t
LEFT JOIN posts AS p ON (p.category_id=t.id)
GROUP BY t.id
ORDER BY id DESC

В принципе с поставленной задачей должны справляться они все. Но в моем случае все кроме последнего не выдавали должного результата.

Поблагодарить автора

One Response to Count записей в категории

  1. Под рукой средства проверить нет, но первый запрос, нам моё имхо, должен выглядеть так (но такой подход не отобразит категории с нулевым кол-вом записей):

    // ------------------------------------------------

    SELECT categories.*, COUNT (posts.category_id)

    FROM categories, posts

    WHERE categories.id=posts.category_id

    GROUP BY posts.category_id

    // ------------------------------------------------

    Второй запрос вообще в корень не верный...

    Третий запрос должен выглядеть так (но он, у категорий с кол-вом постов 0 покажет кол-во постов 1... это из-за left join'а и значением null, которое посчитается):

    / ------------------------------------------------

    SELECT categories.id, COUNT ( * )

    FROM categories LEFT JOIN posts ON posts.category_id=categories.id

    GROUP BY categories.id

    / ------------------------------------------------

    Четвертый запрос — почти то, что надо. Объеденять надо только по другому, и считать лучше другое:

    / ------------------------------------------------

    SELECT t.id, COUNT (p.category_id) as cnt

    FROM categories as t LEFT OUTER JOIN posts as p ON t.id=p.category_id

    GROUP BY t.id

    / ------------------------------------------------

    А теперь если присмотреться, то увидим, что четвертый запрос — это почти 5. Только 5 — кривой. :)

    Вывод: плохо знаешь SQL, товарищ ;)

    С уважением, ваш покорный слуга

    Граф Монте-Кристо!

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>