我正在尝试弄清楚如何在与我正在加入的表相关的单独表中返回多个不同项目的计数。
我对连接还很陌生,所以我不确定我是否使用了正确的连接。希望你能帮助我!
表格会是这样的:
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/