postgresql: нужен запрос sql, чтобы узнать, сколько сообщений в одной категории - PullRequest
0 голосов
/ 14 декабря 2011

\ d сообщений

                                   Table "public.posts"
   Column    |          Type          |                     Modifiers                      
-------------+------------------------+----------------------------------------------------
 id          | integer                | not null default nextval('posts_id_seq'::regclass)
 title       | character varying(100) | not null
 content     | character varying(500) | not null
 created_at  | date                   | 
 updated_at  | date                   | 
 tags        | character varying(55)  | not null default '50'::character varying
 category_id | integer                | not null default 1
Indexes:
    "posts_pkey" PRIMARY KEY, btree (id)

\ d категорий

                                    Table "public.categories"
    Column     |         Type          |                        Modifiers                        
---------------+-----------------------+---------------------------------------------------------
 id            | integer               | not null default nextval('categories_id_seq'::regclass)
 category_name | character varying(50) | not null
 created_at    | date                  | 
 updated_at    | date                  | 
Indexes:
    "categories_pkey" PRIMARY KEY, btree (id)

Нужно подсчитать и получить количество сообщений для одной категории.Как я могу это сделать?

Ответы [ 4 ]

4 голосов
/ 14 декабря 2011
SELECT c.id, c.category_name, COUNT(p.id)
   FROM public.categories c
       LEFT JOIN public.posts p
           ON c.id = p.category_id
   GROUP BY c.id, c.category_name
3 голосов
/ 14 декабря 2011
SELECT c.category_name, count(p.id) as NumberOfPosts
FROM public.posts p
LEFT JOIN public.categories c ON (p.category_id = c.id)
GROUP BY c.category_name

Чтобы ответить на следующий вопрос в комментарии, вы можете отфильтровать 0 отсчетов, используя вложенный запрос:

SELECT * 
FROM (
    SELECT c.category_name, count(p.id) as NumberOfPosts
    FROM public.posts p
    LEFT JOIN public.categories c ON (p.category_id = c.id)
    GROUP BY c.category_name
) as countedPosts
WHERE countedPosts.NumberOfPosts > 0
3 голосов
/ 14 декабря 2011
SELECT category_id, count(*) AS ct
FROM   posts
WHERE  category_id = $search_cat_id
GROUP  BY 1
1 голос
/ 14 декабря 2011

Для одной категории:

select count(*) from posts where category_id=YOUCATEGORY;

Для всех категорий

select c.category_name, count(*) from posts p, categories c where p.category_id = c.id group by c.id having count(*) != 0;
...