2017-11-13 12 views
0

私は私のプロジェクトをリストしたいとポストの量は、それぞれのプロジェクトがあります。テーブルをLEFT JOINして行をカウントするにはどうすればよいですか?

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

しかし、私はエラーメッセージを取得:

 `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>"; 
    } 

その結果、私は期待し

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS posts,

だから私はposts.*に変更しました。posts.id

しかし、その後、私の結果は次のとおりです。

Project 1 has 3 posts. 

私は今、実際に私が必要とする結果を達成するためにどのように混乱しています。

答えて

4

count(po。*)のためにエラーが発生しました。これは、count()関数の内部で1つの列に数える必要があります。

プロジェクトテーブルの対応するID列の「名前」列がポストテーブルで何回見つかるかを調べるため、プロジェクトに参加したポストからposts.nameを数えます。

我々は(数(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

関連する問題