Mysql两个查询合二为一(内连接?)

时间:2013-04-04 22:59:34

标签: mysql

我需要在一个中返回两个查询的结果。我已阅读其他帖子,我不确定这是否应该是内部联接。

我想要这两个问题:

MariaDB [servers]> select * from servers;
+----+------------+---------+------------+
| id | servername | ip      | returncode |
+----+------------+---------+------------+
|  1 | server1    | 0.0.0.0 | 0          |
|  2 | server2    | 0.0.0.0 | 1          |
|  3 | server2    | 0.0.0.0 | 0          |
|  4 | server3    | 0.0.0.0 | 0          |
|  5 | server3    | 0.0.0.0 | 4          |
|  6 | server3    | 0.0.0.0 | 4          |
|  7 | server3    | 0.0.0.0 | 4          |
+----+------------+---------+------------+

MariaDB [servers]> select servername,count(returncode) from servers where returncode<>0 group by servername;
+------------+-------------------+
| servername | count(returncode) |
+------------+-------------------+
| server2    |                 1 |
| server3    |                 3 |
+------------+-------------------+

这样的事情:

MariaDB [servers]> select ?????????
+----+------------+---------+------------+-------------------+
| id | servername | ip      | returncode | count(returncode) |
+----+------------+---------+------------+-------------------+
|  1 | server1    | 0.0.0.0 | 0          | 0                 |
|  2 | server2    | 0.0.0.0 | 1          | 1                 |
|  3 | server2    | 0.0.0.0 | 0          | 1                 |
|  4 | server3    | 0.0.0.0 | 0          | 3                 |
|  5 | server3    | 0.0.0.0 | 4          | 3                 |
|  6 | server3    | 0.0.0.0 | 4          | 3                 |
|  7 | server3    | 0.0.0.0 | 4          | 3                 |
+----+------------+---------+------------+-------------------+

有人可以帮我理解怎么做吗?我觉得这是一个内心的联系,但我不确定我完全理解这个概念..

1 个答案:

答案 0 :(得分:1)

您可以使用子查询获取每个服务器的returncode计数,然后使用LEFT JOINservers表来获取结果:

select s.id, s.servername, s.ip, s.returncode, 
  coalesce(c.totalcount, 0) TotalCount
from servers s
left join
(
  select servername, count(returncode) TotalCount
  from servers
  where returncode<>0
  group by servername
) c
  on s.servername = c.servername;

请参阅SQL Fiddle with Demo

我选择了LEFT JOIN,因此即使子查询中没有匹配的行,您也会返回servers表中的所有行。