我有两张桌子:
ci_categories
使用字段cat_id
,cat_name
,cat_slug
等
ci_albums
使用字段cat_id
,album_id
,album_name
等
我想在每个类别中加入这两个表,显示类别列表和COUNT个相册。像:
第1类 - 20张专辑
第2类 - 25张专辑
如何在PostgreSQL中正确完成?
答案 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
测试性能。