我想在每个部门的每个角色中显示员工人数。为此,我创建了下面提到的查询。但它没有给出(a)所有角色(b)在员工数量为零的相应部门中担任角色的所有员工。
SELECT qodi.department_name,IFNULL(qobi.band_name, 'No Band') 'Band',count(qu1.user_id) emp_count
FROM
qee_org_dept_info qodi
LEFT OUTER JOIN qee_user qu1 ON qodi.department_name =qu1.department AND qu1.org_id=1
LEFT OUTER JOIN qee_org_band_info qobi ON qobi.band_name = qu1.band_name
GROUP BY qodi.department_name,qobi.band_name
ORDER BY qodi.department_name
角色在qee_org_band_info中定义。用户在qee_user和qee_org_dept_info
中的部门中定义预期结果是: - 即使相应部门中该角色的员工人数为零,所有部门和所有角色也应该到来。
答案 0 :(得分:1)
即使相应部门中该角色的员工人数为零,也应该来到所有部门和所有角色。
这意味着,您需要在部门和角色之间进行笛卡尔联接,并将员工加入笛卡尔联接的结果。
SELECT qodi.department_name,IFNULL(qobi.band_name, 'No Band') 'Band',count(qu1.user_id) emp_count
FROM
(qee_org_dept_info qodi INNER JOIN qee_org_band_info qobi)
LEFT OUTER JOIN qee_user qu1 ON qodi.department_name =qu1.department AND qobi.band_name = qu1.band_name AND qu1.org_id=1
GROUP BY qodi.department_name,qobi.band_name
ORDER BY qodi.department_name
请注意,我更改了连接的顺序,并且我使用了内连接而不是左连接部门和乐队。根据mysql文档:
INNER JOIN和(逗号)在没有连接条件的情况下在语义上是等价的:两者都在指定的表之间产生笛卡尔积(也就是说,第一个表中的每一行都连接到每一行中的每一行第二个表)。
从技术上讲,内连接表达式周围不需要括号,但是,我觉得这样的代码更具可读性。