2013-05-02 85 views
1

我想從左連接中得到一個表的總數,其中有多個相同的ID。下面是我下面的例子 -左連接的SQL計數結果

表1:

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| project_id | int(11)  | NO |  | NULL |    | 
| token  | varchar(32) | NO |  | NULL |    | 
| email  | varchar(255) | NO |  | NULL |    | 
| status  | char(1)  | NO |  | 0  |    | 
| permissions | varchar(255) | YES |  | NULL |    | 
| created  | datetime  | NO |  | NULL |    | 
| modified | datetime  | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

表2:

+------------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+------------+-------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(32) | NO |  | NULL |    | 
| account_id | int(11)  | NO |  | NULL |    | 
| created | datetime | NO |  | NULL |    | 
| modified | datetime | NO |  | NULL |    | 
| active  | tinyint(1) | YES |  | 1  |    | 
+------------+-------------+------+-----+---------+----------------+ 

我到目前爲止這種說法 -

SELECT account_id, (SELECT COUNT(invitations.id) 
    FROM invitations WHERE invitations.project_id = projects.id) AS inv_count 
FROM projects order by account_id; 

而這裏的結果的樣本:

+------------+-----------+ 
| account_id | inv_count | 
+------------+-----------+ 
|   1 |   0 | 
|   2 |   2 | 
|   2 |   0 | 
|   3 |   4 | 
|   3 |   0 | 
|   3 |   4 | 
|   3 |   0 | 
|   4 |   6 | 
|   4 |   3 | 
|   4 |   3 | 
|   4 |   5 | 
|   4 |   3 | 
|   4 |   9 | 
|   5 |   6 | 
|   5 |   0 | 
|   5 |   4 | 
|   5 |   2 | 
|   5 |   2 | 

我如何獲取account_id以顯示一次,並顯示inv_count的總和爲1行?所以,我應該看到 -

+------------+-----------+ 
| account_id | inv_count | 
+------------+-----------+ 
|   1 |   0 | 
|   2 |   2 | 
|   3 |   8 | 

回答

3

你只需把你的查詢中派生表(並將其命名爲,說tmp),然後組由account_id

SELECT account_id, 
     SUM(inv_count) AS inv_count 
FROM 
    (SELECT account_id, 
      (SELECT COUNT(invitations.id) 
      FROM invitations 
      WHERE invitations.project_id = projects.id 
      ) AS inv_count 
    FROM projects 
) AS tmp 
GROUP BY account_id 
ORDER BY account_id ; 

爲了簡化它更遠,您可以將內聯子查詢轉換爲LEFT連接。這樣,不需要派生表。我還添加了別名並刪除了ORDER BY。 MySQL的執行一個隱含的ORDER BY當你有這麼GROUP BY不是這裏需要它(除非你想通過一些其他的表情,從一個你組由不同的命令):

SELECT 
    p.account_id, 
    COUNT(i.id) AS inv_count 
FROM 
    projects AS p 
    LEFT JOIN 
    invitations AS i 
     ON i.project_id = p.id 
GROUP BY 
    p.account_id ; 
+0

驚人,工程。 fyi-不是一些研究誰不研究,等嘗試不同的事情幾個小時試圖得到它。再次感謝。你能解釋一下這裏發生了什麼嗎? – waffles 2013-05-02 22:17:28