MySQL:如何在给定条件下获得逆结果?

时间:2019-04-30 13:13:03

标签: mysql sql

我写了一个查询来获得与查询结果完全相反的结果。

查询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

2 个答案:

答案 0 :(得分:4)

如果将JOIN更改为LEFT JOIN,然后仅选择s.idNULL的行,则会得到所需的计数:

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';