在单个表上执行set减法

时间:2011-03-16 04:33:01

标签: mysql sql

我有一张存储会员记录的表。每位会员每年创纪录一次。 例如:

MEMBER   YEAR
--------------
steve    2011
steve    2010
bob      2010
jane     2011

我想要生成的是给定年份的失效成员列表(未续订的成员)。类似于“让所有参加2010年而非2011年参赛的会员”。

我一直在和这个人争吵一段时间,我能找到的最接近的例子涉及比较两个表格。

2 个答案:

答案 0 :(得分:3)

使用LEFT JOIN / IS NULL

   SELECT a.member
     FROM YOUR_TABLE a
LEFT JOIN YOUR_TABLE b ON b.member = a.member
                      AND b.year = 2011
    WHERE a.year = 2010
      AND b.member IS NULL

使用NOT EXISTS

   SELECT a.member
     FROM YOUR_TABLE a
    WHERE a.year = 2010
      AND NOT EXISTS (SELECT NULL
                        FROM YOUR_TABLE b 
                       WHERE b.member = a.member
                         AND b.year = 2011)

使用NOT IN

SELECT a.member
  FROM YOUR_TABLE a
 WHERE a.year = 2010
   AND a.member NOT IN (SELECT b.member
                          FROM YOUR_TABLE b 
                         WHERE b.year = 2011)

效果

性能取决于比较的列是否为NULL(值可以为NULL):

答案 1 :(得分:0)

如果我们要简化这个问题,那就是“获取未续订x年的会员名单”

如果我们分开这个问题,它将基本上产生,得到所有注册小于指定年份(x)的成员。

所以我们可以将查询写成

select Member from membership where year < 2011

您可以使用某种方法的参数来构建此查询,以便您可以指定年份。

由于

Neelesh