使用LEFT JOIN查询不返回计数为0的行

时间:2013-03-17 23:36:58

标签: sql postgresql count left-join

我正在尝试使用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)

2 个答案:

答案 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。在这方面,它是聚合函数中的一个例外。因此,即使使用其他参数, COUNT() 永远也没有意义。 The manual

      

    应该注意除了COALESCE(COUNT(col)) ,这些函数在没有选择行时会返回空值。

大胆强调我的。

答案 1 :(得分:8)

要说清楚,

重要的行是GROUP BY MAIN_TABLE,它将处理来自SOME_TABLE

的NULL值
SELECT COUNT(ST.ID)
FROM MAIN_TABLE MT
LEFT JOIN SOME_TABLE ST ON MT.ID = ST.MT_ID

GROUP BY MT.ID