2013-09-27 51 views
1

我有两个包含多个字段的表。MySQL查询COUNT并从另一个表中加入列

表1:

+--------+---+---------------+             
| month | id| VERDICT_id |             
+--------+------+------------+             
| 201307 | 1 |    1 |             
| 201307 | 2 |    4 |             
| 201307 | 3 |    2 |             
| 201307 | 4 |    2 |             
| 201307 | 5 |   NULL |             
| 201307 | 6 |    1 |             
+--------+------+------------+ 

像这样每一个新的“月”,对于每一个独特的“身份证”的“VERDICT_ID”根据表2中的值设置。

表2:

+----+----------------------------------+ 
| id | title       | 
+----+----------------------------------+ 
| 1 | Passed       | 
| 2 | Failed (Component Fault)   | 
| 3 | Failed (User Fault)    | 
| 4 | Failed (Hardware Issue)   | 
+----+----------------------------------+ 

我做一个查询这给下面的输出

实际输出:

+--------+------------+----------+ 
| month | VERDICT_id | COUNT(*) | 
+--------+------------+----------+ 
| 201307 |   1 |  2 | 
| 201307 |   2 |  2 | 
| 201307 |   4 |  1 | 
+--------+------------+----------+ 

我要的是,

+--------+------------+----------+ 
| month | VERDICT_id | COUNT(*) | 
+--------+------------+----------+ 
| 201307 |   1 |  2 | 
| 201307 |   2 |  2 | 
| 201307 |   3 |  0 | 
| 201307 |   4 |  1 | 
+--------+------------+----------+ 

的区别该se 2输出是,如果任何VERDICT_id在一个月内不存在,那么我想打印VERDICT_id和COUNT为'0'。

但用下面的查询是不可能的。

select month,VERDICT_id, COUNT(*) FROM Table1 
where (month = 201307) AND (VERDICT_id BETWEEN 1 AND 4) GROUP BY month, VERDICT_id; 

问:是否可以使查询打印不存在的VERDICT_id和COUNT为'0'?

+2

您需要做一个左连接|可能的重复[如何显示在mySQL组中按零查询计数行?](http://stackoverflow.com/questions/6602343/how-to-show-rows-with-zero-counts-in-mysql-group - 查询) – Paulina

回答

2

试试这个

SELECT v.*, count(t.verdict_id) as cnt FROM 
(
     SELECT month, id as verdict_id 
     from 
      (SELECT DISTINCT month FROM Table1 where (month = 201307)) M , 
      verdictTable 
) v 
LEFT OUTER JOIN Table1 t ON v.verdict_id = t.verdict_id and v.month = t.month 
GROUP BY v.verdict_id, v.month 
+0

我想你的意思是'count(t.id)'。 'count(*)'将包含table1中没有条目的行。 – 2013-09-27 16:13:47

+0

完美!它正在按照我的要求工作......感谢您的快速帮助......我花了整整一天的时间试图获得像这样的解决方案...... – himansusn

0

尝试

select month,VERDICT_id, COUNT(*) as num FROM Table1 
where (month = 201307) AND (VERDICT_id BETWEEN 1 AND 4) 
GROUP BY month, VERDICT_id having num > 0; 
0

需要强制月和VERDICT_id领域时,记录不存在。 (该月强制使用DISTINCT LIST,VERDICT_ID强制使用JOIN,无条件表2)

SELECT LIST.`month` as `month`, Table2.id AS VERDICT_id, COUNT(Detail.id) 
FROM 
    (SELECT DISTINCT `month` 
    FROM Table1 
    WHERE Table1.`month` = 201307) AS LIST 
JOIN Table2 
LEFT JOIN Table1 AS Detail 
    ON LIST.`month` = Detail.`month` 
    AND Table2.id = Detail.VERDICT_id 
GROUP BY `month`, VERDICT_id 
ORDER BY `month`, VERDICT_id; 
+0

该解决方案的工作原理并不一致。对于一些月份,没有任何行使用VERDICT_id进行更新,并将其设置为NULL。在这种情况下,此查询仅将VERDICT_id打印为“1”,将COUNT(*)打印为“0”。 – himansusn

相关问题