【问题标题】:MySQL COUNT on multiple relationsMySQL COUNT 对多个关系
【发布时间】:2015-05-21 15:27:03
【问题描述】:

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

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

表格是这样的:

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,例如有多少医生、多少护士等。我还希望查询从 staff_type 表中获取数据。

我对如何构造这个查询没有太多想法,但它可能看起来像这样:

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

我知道这与它应该的完全不同,希望你们中的一些人能指出我正确的方向。关于这个主题的其他帖子对我来说很难理解,并且看起来他们正在尝试做一些稍微不同的事情。

感谢您的帮助!

【问题讨论】:

    标签: mysql database join count


    【解决方案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 BYSELECT 列表中的聚合表达式 (COUNT) 函数,然后查看 JOIN 操作返回的行。

    例如:

    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 值加一。因此,我们使用一个表达式COUNT(s.id),如果有来自员工的匹配行,我们保证将是非 NULL,如果没有匹配的行,则保证为 NULL。

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

    【讨论】:

    • 为了查看“外部连接”的操作,向staff_type 添加一个在staff 中没有任何对应行的新行,您应该得到该@987654338 的零计数@。删除 LEFT 关键字以使其成为“内连接”,并且 staff_type 不会出现在结果集中。无论哪种方式都可以,这取决于您要返回的结果。但是您给出的示例看起来很像用户可能希望看到零计数的情况......如果规范类似于“列出所有人员类型以及每种类型的人员数量”
    • 非常感谢您的帮助,先生,这就像一个魅力!我对连接之间差异的了解很少,但您的帖子将帮助我更好地掌握它,再次感谢!
    【解决方案2】:

    查询将是,

    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
    

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 2014-12-11
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      相关资源
      最近更新 更多