我正在尝试使用PostgreSQL中的左连接为每个组织返回一个计数,但我无法弄清楚它为什么不起作用:
select o.name as organisation_name,
coalesce(COUNT(exam_items.id)) as total_used
from organisations o
left join exam_items e on o.id = e.organisation_id
where e.item_template_id = #{sanitize(item_template_id)}
and e.used = true
group by o.name
order by o.name
使用coalesce
似乎不起作用。我的智慧结束了!任何帮助肯定会受到赞赏!
为了澄清什么不起作用,目前查询只返回计数大于0的组织的值。我希望它为每个组织返回一行,无论计数如何
表定义:
TABLE exam_items
id serial NOT NULL
exam_id integer
item_version_id integer
used boolean DEFAULT false
question_identifier character varying(255)
organisation_id integer
created_at timestamp without time zone NOT NULL
updated_at timestamp without time zone NOT NULL
item_template_id integer
stem_id integer
CONSTRAINT exam_items_pkey PRIMARY KEY (id)
TABLE organisations
id serial NOT NULL
slug character varying(255)
name character varying(255)
code character varying(255)
address text
organisation_type integer
created_at timestamp without time zone NOT NULL
updated_at timestamp without time zone NOT NULL
super boolean DEFAULT false
CONSTRAINT organisations_pkey PRIMARY KEY (id)
答案 0 :(得分:60)
这应该有效:
SELECT o.name AS organisation_name
, COUNT(e.id) AS total_used
FROM organisations o
LEFT JOIN exam_items e ON e.organisation_id = o.id
AND e.item_template_id = #{sanitize(item_template_id)}
AND e.used = true
GROUP BY o.name
ORDER BY o.name;
您有一个LEFT [OUTER] JOIN
,但后来的WHERE
条件使其显示为普通[INNER] JOIN
。
将条件移动到JOIN
子句以使其按预期工作。这样,只有满足所有这些条件的行才会首先连接(或 right 表中的列填充为NULL)。就像你拥有它一样,在LEFT JOIN
之后 {} {}}
JOIN
永远不会返回NULL。在这方面,它是聚合函数中的一个例外。因此,即使使用其他参数, 永远也没有意义。 The manual:COUNT()
应该注意除了
COALESCE(COUNT(col))
,这些函数在没有选择行时会返回空值。
大胆强调我的。
答案 1 :(得分:8)
要说清楚,
重要的行是GROUP BY MAIN_TABLE
,它将处理来自SOME_TABLE
SELECT COUNT(ST.ID)
FROM MAIN_TABLE MT
LEFT JOIN SOME_TABLE ST ON MT.ID = ST.MT_ID
GROUP BY MT.ID