将Same Table嵌套查询转换为JOIN

时间:2015-09-18 11:48:31

标签: mysql sql

我们必须在同一个表上查询。表'Foo',结构是这样的,

Foo
-------------
ID  MID  AID STATUS
1   12   88  A
2   12   88  B
3   13   88  A
4   13   88  B
5   14   88  A
6   15   88  A

所以我们只需要那些STATUS = A但不是STATUS!= B的记录。我们成功创建了嵌套查询。但是这张表包含了数百万条记录,并且耗费了太多时间。

使用嵌套查询

SELECT FO.MID FROM FOO FO WHERE FO.AID = 188 AND FO.STATUS = 'A' AND FO.MID NOT IN 
(SELECT FO.MID FROM FOO FO WHERE FO.AID = 188 AND FO.STATUS = 'B' AND FO.MID IS NOT NULL)

那么如何使用JOIN快速实现这一目标呢?

2 个答案:

答案 0 :(得分:1)

一种方法是聚合:

select fo.mid
from foo fo
group by fo.mid
having sum(fo.status = 'A') > 0 and
       sum(fo.status = 'B') = 0;

如果你有一张mid表,那么最好的方法可能就是:

select m.mid
from mids m
where exists (select 1 from foo where fo.mid = m.mid and fo.status = 'A') and
      not exists (select 1 from foo where fo.mid = m.mid and fo.status = 'B');

对于此查询的效果,您需要foo(mid, status)上的索引。

答案 1 :(得分:1)

我有一个关于MID的索引,那么下面的查询可能有帮助。

SELECT FO.MID 
FROM FOO FO 
WHERE FO.AID = 88 AND FO.STATUS = 'A' AND 
      NOT EXISTS (SELECT 1 FROM FOO f WHERE fo.MID=f.MID AND F.STATUS = 'B')