我写了一个查询来获得与查询结果完全相反的结果。
查询1:
select count(*) from DB.titlecard tt
join _date d on d.td_id = tt.td_id
join sometask s on s.s_id = tt.s_id and d.em_id = s.em_id
where d.`date` > "2019-01-01";
它给了我 21354 个结果的计数。
查询2:(类似的查询,没有进行某些任务连接)
select count(*) from DB.titlecard tt
join _date d on d.td_id = tt.td_id
where d.`date` > "2019-01-01";
产生 28984
我需要与查询2-查询1不同的记录
类似的东西, 但它提供了100万条记录。
select count(*) from DB.titlecard tt
join _date d on d.td_id = tt.td_id
join sometask s on s.s_id <> tt.s_id and d.em_id = s.em_id
where d.`date` > "2019-01-01";
我知道通过比较两个查询来获得差异。
但是我正在寻找单个查询中的更好方法(因为我在查询1中仅添加了一个表)
仅此而已, 查询1:
join sometask s on s.s_id = tt.s_id
我想申请的条件,
join sometask s on s.s_id <> tt.s_id
答案 0 :(得分:4)
如果将JOIN
更改为LEFT JOIN
,然后仅选择s.id
为NULL
的行,则会得到所需的计数:
select count(*) from DB.titlecard tt
join _date d on d.td_id = tt.td_id
left join sometask s on s.s_id = tt.s_id and d.em_id = s.em_id
where d.`date` > "2019-01-01" and s.s_id IS NULL;
答案 1 :(得分:1)
这可能非常复杂-尤其是如果有NULL
个值或重复的行。不过,我猜测这可以满足您的要求:
select count(*) - count(s.s_id)
from DB.titlecard tt join
d
on d.td_id = tt.td_id left join
sometask s
on s.s_id = tt.s_id and d.em_id = s.em_id
where d.`date` > '2019-01-01';