我有两个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或任何其他单个查询在结果中获取此缺失值以及计数为零?
答案 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组合,以防每个名称没有值。