你算错了。说count(*)
基本上计算返回的行,您将获得带有 NULL 项目的行(如预期的那样),但count(*)
将它们视为行,因此您得到1
. 如果没有项目,您需要计算一个为 NULL 的列,如果有,则为非 NULL:
select ..., count(c) as projectnum ....
中c
的一些非 NULL 列在哪里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 |
+------+---------------+
在第一个中做 acount(*)
会让你迷路1
,id=4
但count(tag_id)
在第二个中会给你预期的0
.