如何LEFT JOIN一个表并COUNT行?

时间:2017-11-13 10:18:13

标签: mysql

我想列出我的项目以及每个项目的帖子数量:

     `projects`                `posts`
------------------     ------------------
| `id`  | `name` |     | `id`  | `name`  |
------------------     ------------------
|   1   | Cat    |     |   1   |    Cat  |
|   2   | Dog    |     |   2   |    Cat  |
|   3   | Bird   |     |   3   |    Dog  |
|   4   | Frog   |     ------------------
------------------



$projects = $db->query('SELECT *,
    COUNT(posts.*) AS posts
    FROM projects
    LEFT JOIN posts ON projects.name=posts.name 
  ')->fetchAll(PDO::FETCH_ASSOC);



    foreach($projects as $row) {
       echo "Project ".$id." has ".$posts ".posts.".<br>"; 
    }

因此我希望:

Project 1 has 2 posts.
Project 2 has 1 posts.
Project 3 has 0 posts.
Project 4 has 0 posts.

但是我收到一条错误消息:

  

致命错误:未捕获PDOException:SQLSTATE [42000]:语法错误或   访问冲突:1064您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   在'*)AS帖子附近使用的语法,

所以我将posts.*更改为posts.id

但后来我的结果是:

Project 1 has 3 posts.

我实际上现在很困惑如何实现我需要的结果。

1 个答案:

答案 0 :(得分:4)

由于count(po。*)引发了错误,你必须只计算count()函数内的一列。

因此,我们想知道有多少次在posts表中找到项目表中相应id列的'name'列,所以我们应该从与项目相关联的帖子中计算posts.name。

我们需要左联接,因为我们还想知道它是否没有共同对象(count(po.name)= 0))

下面的查询将完成这项工作:

SELECT p.*,COUNT(po.name) AS posts
    FROM projects p
    left join posts po on p.name = po.name
    group by p.id

您可以在此处查看:http://sqlfiddle.com/#!9/3e9d4b/4