SQL COUNT() function and LEFT OUTER JOIN

6

我有两个表,一个是用户表,另一个是部门表。我想要一张新的表格,其中包含两列:第一列是部门名称,第二列是该部门所拥有的用户数。 以下是相关代码:

SELECT department_name as 'deptName', 
       COUNT(users.department_id) as 'userCount' 
FROM departments
LEFT OUTER JOIN users
ON departments.id = users.department_id 
GROUP BY 'deptName'

部门表的列包括:

 integer id PK

 varchar(20) department_name

用户表列包括:

 integer id PK

 varchar(20) name

 varchar(20) surname

 int department_id FK

但是它没有起作用。

现在我有两个部门,输出应该是两行,第一行计数为8,第二行计数为1。 但是我只看到一行,所有计数都是(9)。 我使用安装在XAMPP上的MySQL。


你能提供一个样本数据集来测试 @fiddle 吗? - M Khalid Junaid
1个回答

11
SELECT department_name as 'deptName',
       COUNT(users.department_id) as 'userCount'
  FROM departments
  LEFT OUTER JOIN users
    ON departments.id = users.department_id
 GROUP BY `deptName`

请注意在 GROUP BY 子句中使用的勾号,而不是单引号(这是键盘上“1”左侧的按键)。请参阅:http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

你也可以只按 department_name 进行分组(使用字段本身,而不是别名)。

目前你正在对字面值'deptName'进行分组,而不是给出别名deptName的字段,这就是为仅返回1行的原因。你实际上没有做任何分组。


当我将单引号改为双引号,并使用 department_name 而不是 'dept_name' 时,它完美地工作了 :) 谢谢 :) 但如果我使用 "dept_name",我认为它应该可以工作 - 是吗? - Radek Anuszewski
在group by子句中,使用我编辑中显示的反引号或字段名称(department_name)。我会使用字段名称而不是别名,因为这样更容易,并且不会因为使用MySQL以外的数据库而有所变化。在GROUP BY中,如果使用别名,我认为你将不得不使用反引号。 - Brian DeMilia
您编辑后的版本也完美地运行了,我完全忘记了 MySQL 中的“ ` ”,非常感谢您。 - Radek Anuszewski
当我说勾号时,我的意思是键盘上标签键上方和数字1左侧的键,而不是单引号。对于选择列表,您可以使用勾号、单引号或双引号作为别名,但对于GROUP BY,您必须使用勾号、单引号或双引号,否则别名将无法正常工作。但是,您可以放弃别名,仅使用字段名称。此外,如果您不关心大小写敏感性并避免前导数字,则选择列表中的别名不需要任何勾号或引号。 - Brian DeMilia
@Pneumokok 没问题,如果您已经准备好了,请将此标记为答案。 - Brian DeMilia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接