MySQL COUNT 多重关系

标签 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

我想构建一个语句,返回各种不同员工类型的计数,例如有多少医生、多少护士等。我还希望查询从 staff_type 表中获取数据。

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

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

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

感谢您的帮助!

最佳答案

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

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

要了解其作用,您可以删除 SELECT 列表中的 GROUP BY 和聚合表达式 (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 值递增 1。因此,我们使用一个表达式,COUNT(s.id) 如果有匹配行来自员工,我们保证将是非 NULL,如果没有匹配行则为 NULL .

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

关于MySQL COUNT 多重关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378073/

相关文章:

mysql - 左连接与内连接相结合,不返回左表中的所有行

php - 在 Laravel 中如何在查询中不带参数的 groupBy Url

sql-server - 是否可以编写包含一对多关系的数据库 View ?

javascript - 使用 Sequelize.js 的 FK (mysql-db)

java - 是否可以将数据库表与事务中的读取操作隔离开来?

mysql - 如何根据下拉框选择自动生成文本字段

mysql - Rails 发现没有返回数据库中存在的记录

mysql - 如何合并 2 个 mysql 行并得到一行

python - 删除多个字符并加入 pandas 列

php - 连接从数据库返回的相等值