关于多个关系的MySQL COUNT

时间:2015-05-21 15:27:04

标签: mysql database join count

我试图弄清楚如何在与我加入的表相关的单独表格中返回多个不同项目的计数。

我很新加入,所以我不确定我是否使用正确的加入。希望你能帮助我!

表格如下:

staff_type表

id        type
1         doctor
2         nurse
3         surgeon

员工表

id        type_id        name
1         1              bob
2         1              jane
3         2              phil
4         2              esther
5         3              michael jackson

想要构建一个语句,它将返回各种不同人员类型的COUNT,例如有多少个dactors,多少个护士等。我也希望查询从staff_type表中获取数据。

我对如何构建此查询有很多想法,但它可能看起来像这样:

SELECT staff_type.*, COUNT(Staff.type_id = staff_type.id)
INNER JOIN staff AS Staff ON (staff_type.id = Staff.type_id)

我知道这与它应该是的一样,有希望你们中的一些人可以指出我正确的方向。关于这个主题的其他帖子对我来说很难理解,看起来他们正试图做一些稍微不同的事情。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你可以使用这样的例子作为例子:

SELECT t.id
     , t.name
     , COUNT(s.id) AS count_staff
  FROM staff_type t
  LEFT
  JOIN staff s
    ON s.type_id = t.id
 GROUP
    BY t.id
     , t.name

要了解它正在做什么,您可以删除GROUP BY列表中的COUNT和聚合表达式(SELECT)函数,并查看JOIN操作返回的行。 / p>

例如:

SELECT t.id      AS `t.id`
     , t.name    AS `t.name`
     , s.id      AS `s.id`
     , s.name    AS `s.name`
     , s.type_id AS `s.type_id`
  FROM staff_type t
  LEFT
  JOIN staff s
    ON s.type_id = t.id
 ORDER
    BY t.id
     , s.id

请注意,LEFT关键字表示“外部联接”。这将返回左侧表中的所有行,即使右侧没有任何匹配的行。 (这将让我们得到一个没有任何相关人员的staff_type的“零”计数。)

当我们添加GROUP BY子句时,它表示“折叠”GROUP BY列表中表达式或列具有相同值的所有行。

我们可以使用聚合功能,例如COUNT()SUM()MAX()MIN()来执行所有操作折叠成组的行。

COUNT()聚合从零开始,并且对于每个非NULL值递增1。因此,我们使用一个表达式COUNT(s.id),如果有来自谱表的匹配行,我们保证将为非NULL,如果没有匹配的行,则为NULL。

(我希望这有助于消除你的一些困惑。)

答案 1 :(得分:0)

查询将是,

select staff_type.*, count(staff.id) as count  from staff_type left join staff on (staff.type_id = staff_type.id) group by staff_type.id