使用空值计数不正常

时间:2013-11-10 05:29:23

标签: mysql sql

我想计算分配给每位员工的项目数量。但是我也希望包含那些目前没有在任何项目上工作的人的名字,显然计数值应为空白或为空。以下是我到目前为止所做的事情:

Select
lname
, ssn
, COUNT(*) AS projectnum
FROM
employee LEFT OUTER JOIN works_on
ON essn=ssn
GROUP BY 
lname
ORDER BY
projectnum DESC

它工作得很好,除了在projectnum字段中,它为那些不在任何项目上工作的人提供1而不是null,我该如何解决?

1 个答案:

答案 0 :(得分:2)

你算错了。假设count(*)基本上对返回的行进行计数,您将获得具有NULL项目的行(按预期),但count(*)将这些行视为行,因此您获得1。如果没有项目,则需要计算一个为NULL的列;如果存在,则需要非NULL;

select ..., count(c) as projectnum ....

其中c是来自works_on的非空列。


例如,我在MySQL沙箱中有这些表:

mysql> select * from posts;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+

mysql> select * from posts_tags;
+---------+--------+
| post_id | tag_id |
+---------+--------+
|       1 |      1 |
|       1 |      2 |
|       1 |      3 |
|       2 |      2 |
|       2 |      3 |
|       3 |      2 |
+---------+--------+

您可以看到count(*)count(tag_id)

之间的区别
mysql> select posts.id, count(*) from posts left join posts_tags on posts.id = posts_tags.post_id group by posts.id;
+------+----------+
| id   | count(*) |
+------+----------+
|    1 |        3 |
|    2 |        2 |
|    3 |        1 |
|    4 |        1 |
+------+----------+

mysql> select posts.id, count(tag_id) from posts left join posts_tags on posts.id = posts_tags.post_id group by posts.id;
+------+---------------+
| id   | count(tag_id) |
+------+---------------+
|    1 |             3 |
|    2 |             2 |
|    3 |             1 |
|    4 |             0 |
+------+---------------+

在第一个count(*)中执行1会为id=4提供一个流浪count(tag_id),但在第二个0中会为您提供预期的{{1}}。