【问题标题】:Count records in each category统计每个类别中的记录
【发布时间】:2014-03-22 09:47:15
【问题描述】:

我有两张桌子:

ci_categories
带有cat_idcat_namecat_slug 等字段。

ci_albums
带有cat_idalbum_idalbum_name 等字段。

我想加入这两个表,显示类别列表,以及每个类别中的 COUNT 个专辑。喜欢:

  • 类别 1 - 20 专辑

  • 类别 2 - 25 专辑

这是如何在 PostgreSQL 中正确完成的?

【问题讨论】:

  • 结果中需要哪些列?可以有没有专辑的类别吗?

标签: sql postgresql count aggregate-functions


【解决方案1】:

下面的查询应该能得到你想要的:

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 不会将其包含在总数中。

【讨论】:

  • 以及如何选择cat_name?
  • 只需在 SELECTGROUP BY 部分的 c.cat_id 之后添加 c.cat_name。
【解决方案2】:
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

【讨论】:

  • 我们也需要,cat_id?我们怎么能得到?
【解决方案3】:
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;

其他答案大致相同,但略有不同,特别是COUNT 中的DISTINCT 和表格的别名。

编辑/警告

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

【讨论】:

  • 你错了。如果没有专辑,内部联接将不包括类别。左外连接会。
【解决方案4】:

如果您对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 测试性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多