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

Категория: SQL Комментариев: 1

Нужно было для своего нового проекта выполнить запрос, который возвращал-бы список категорий и количество записей в категории.
база данных состоит из двух таблиц:
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

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

Автор: Кто-то   @   12 июля 2010 Комментариев: 1
Метки :

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

Webmoney Z163628999150, R617151845974

Комментариев: 1

Комментарии
июля 13, 2010
2:14

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

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

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, товарищ ;)

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

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

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

Предыдущая запись
«
Следующая запись
»