加入两个mysql查询并包含零计数的列值

时间:2017-07-03 22:26:28

标签: mysql join

我有两个MySQL表

desc table_name1;   
Field, Type, Null, Key, Default, Extra
'id', 'int(11)', 'NO', 'PRI', '0', ''
'name', 'varchar(100)', 'YES', '', NULL, ''
'active', 'int(1)', 'YES', '', NULL, ''

desc table_name2;
Field, Type, Null, Key, Default, Extra
'date', 'date', 'NO', 'PRI', '0000-00-00', ''
'col_name1', 'varchar(40)', 'YES', '', '0', ''
'host', 'varchar(100)', 'NO', '', '', ''
'ip', 'varchar(100)', 'NO', 'PRI', '', ''
'snapdate', 'date', 'YES', '', NULL, ''
'col_name2', 'int(11)', 'NO', 'PRI', '0', ''

两个sql查询: sql1:

select id, name from .table_name1 where active = 1 and id not in (2954,2914) order by name;

sql2:

select count(*) from .table_name2 where date= '2017-07-03' and col_name2 = $code; #$code = values in id column from sql1

所以sql1返回9行,然后sql2运行9次(对于sql1的列id中的每个值)

我想做什么: 我想加入这两个查询,以便我可以运行单个查询并仍然得到相同的结果。我想要一个包含两列的表的结果:

name   count
value1 89
value2 184
value3 528

到目前为止我尝试了什么: 所以我使用了内连接并提出了以下sql: SQL3:

    select d.name, count(m.col_name2) as count
      from .table_name1 as d
inner join .table_name2 as m
        on d.id = m.col_name2
     where d.active = 1
       and d.id not in (2954,2914)
       and m.date = '2017-07-03'
  group by d.name
  order by d.name;

我面临的问题:
虽然上面的sql3做了我想要的但它跳过id列中的那些值(来自sql1),这将返回零作为count。 (在sql2中使用时)。

例如,如果sql1正在退回9行,那么sql3只会撤回8行​​,因为它会跳过一个将计为零的值。

我尝试过使用CASE(并删除了“和m.date ='2017-07-03'”):

select d.name, case count(m.col_name2) when m.date = '2017-07-03' then 1 else 0 end as count

另外,我尝试过使用if(并删除“和m.date ='2017-07-03'”):

select d.name, if (m.date = '2017-07-03', count(m.col_name2), 0) as count

但是上述两种尝试都给出了8行(与sql3相同),但计数返回零。

我的问题: 使用CASE时我错过了什么?如何使用修改后的sql3或任何其他单个查询在结果中获取此缺失值以及计数为零?

1 个答案:

答案 0 :(得分:1)

您缺少零值,因为它们在内部联接中没有匹配项。请尝试left join

  select d.name, count(m.col_name2) as count
  from .table_name1 as d
  left join .table_name2 as m
  on d.id = m.col_name2
  where d.active = 1
   and d.id not in (2954,2914)
   and (m.date = '2017-07-03' or m.date is Null)
  group by d.name
  order by d.name;

请注意m.date条件与Null组合,以防每个名称没有值。