我想列出我的项目以及每个项目的帖子数量:
`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.
我实际上现在很困惑如何实现我需要的结果。
答案 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