2013-05-02 86 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