【问题标题】:postgresql: Need a sql query to find how many posts are there with one categorypostgresql:需要一个 sql 查询来查找一个类别有多少帖子
【发布时间】:2012-01-20 12:39:39
【问题描述】:

\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)

需要计算并获取一个类别的帖子数量。我该怎么做?

【问题讨论】:

  • 这不是一个错误,但是'posts'表是否有'categories'表的外键? (我在那里只能看到主键)

标签: sql database postgresql join left-join


【解决方案1】:
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

【讨论】:

  • 如何省略 count = 0 的那些行?
  • @guru:将LEFT JOIN改为INNER JOIN
【解决方案2】:
SELECT category_id, count(*) AS ct
FROM   posts
WHERE  category_id = $search_cat_id
GROUP  BY 1

【讨论】:

  • 不,我不想专门用 category_id 来获取它,而是想用 count 获取所有类别列表。
【解决方案3】:
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

【讨论】:

  • 如何省略 count = 0 的那些行?
【解决方案4】:

对于一个类别:

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;

【讨论】:

  • 我需要 category_name 和 count 。
  • 准备好了,同时省略计数为 0 的行
  • 您的第二个查询是 group by 错误,您还需要添加 group by c.category_name。
  • 不用按category_name分组,因为category_id是唯一的
  • @Jhonathan:仅适用于 PostgreSQL 9.1,并且仅适用于 主键(不仅仅是唯一的)。对于旧版本,您还需要在 GROUP BY 中包含 SELECT 列表的所有非聚合列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多