计算每个类别中的记录

时间:2014-03-22 09:47:15

标签: sql postgresql count aggregate-functions

我有两张桌子:

ci_categories
使用字段cat_idcat_namecat_slug

ci_albums
使用字段cat_idalbum_idalbum_name

我想在每个类别中加入这两个表,显示类别列表和COUNT个相册。像:

  • 第1类 - 20张专辑

  • 第2类 - 25张专辑

如何在PostgreSQL中正确完成?

4 个答案:

答案 0 :(得分:2)

以下查询可以为您提供所需内容:

SELECT c.cat_id, COUNT(a.album_id)
FROM ci_categories AS c
LEFT JOIN ci_albums AS a ON c.cat_id = a.cat_id
GROUP BY c.cat_id

我们在这里使用LEFT JOIN,因为类别可能不包含相册。如果您不关心这些结果是否显示,只需将其更改为INNER JOIN

我们使用聚合COUNT(a.album_id)函数来计算记录数。通过c.cat_id分组,我们确保只对相同类型的记录进行此计数。如果该类别没有专辑,则a.album_id将为NULL,因此COUNT不会将其包含在总计数中。

答案 1 :(得分:0)

select c.cat_name, 
       count(distinct a.album_id) as albums
from ci_categories c
left join ci_albums a on a.cat_id = c.cat_id
group by c.cat_name

答案 2 :(得分:0)

SELECT ci_categories.cat_name, COUNT(*) as count

FROM ci_categories JOIN ci_albums ON ci_categories.cat_id = ci_albums.cat_id

GROUP BY ci_categories.cat_name;

其他答案在某种程度上略有不同,特别是DISTINCT中的COUNT和表格的别名。

编辑/警告

嗯,我的答案实际上是错误的,因为如果该类别中没有专辑,JOIN还会包含类别。然后,该类别会加入NULL值,无论如何都会按COUNT(*)计算。把这个留在这里作为一个常见错误的例子。

答案 3 :(得分:0)

如果您对cat_id以及结果中的相册数量感到满意,则根本不需要查询表ci_categories。使用这个更简单,更快速的查询:

SELECT cat_id, count(*) AS albums
FROM   ci_albums
GROUP  BY 1;

假设没有重复条目的正确表定义。

这不包括根本没有相册的类别。只有当您需要这些时,或者如果您需要表ci_categories本身的其他信息 - 那么您才需要加入该表。但是,由于我们计算所有首先聚合并稍后加入会更快:

SELECT c.cat_id, c.cat_name, COALESCE(a.albums, 0) AS albums
FROM   ci_categories c
LEFT   JOIN (
   SELECT cat_id, count(*) AS albums
   FROM   ci_albums
   GROUP  BY 1
   ) a USING (cat_id);

LEFT JOIN如果您想要包含0张专辑的类别。另外,只需JOIN 只有在结果中需要0而不是NULL时,才需要COALESCE 如果您愿意,可以使用EXPLAIN ANALYZE测试性能。