0

我试图通过 JOINS 找到 2 个不同的结果。表的样子;

SELECT id,member_id,registered_year FROM records;

我可以列出 2012 年和 2013 年注册的会员;

SELECT member_id FROM records a
INNER JOIN records b ON a.member_id=b.member_id
WHERE  a.registered_year='2013' AND b.registered_year='2012';

但我不能列出它的反转。如何列出哪些成员在 2012 年注册但在 2013 年未注册?

提前谢谢。

4

4 回答 4

2
SELECT member_id FROM records a 
WHERE a.registered_year='2012' and  member_id not in 
(
  SELECT member_id FROM records
  WHERE registered_year='2013'
) 

内部选择 SELECT member_id FROM records WHERE registered_year='2013'获取所有在 2013 年注册的用户

外部获取所有不在内部的用户选择在 2012 年注册的用户

于 2013-06-27T22:23:18.130 回答
2
SELECT member_id
  FROM records a
 WHERE registered_year = 2012
   AND NOT EXISTS (SELECT null
                     FROM records b
                    WHERE a.member_id = b.member_id
                      AND b.registered_year = 2013)
于 2013-06-27T22:23:31.067 回答
1

这通常通过NOT EXISTS(或等效的LEFT JOIN / IS NULLNOT IN结构)来解决。在这种特殊情况下,有一种方法GROUP BY

SELECT member_id 
FROM records
WHERE registered_year IN (2012, 2013)
GROUP BY member_id
HAVING MAX(registered_year) = 2012 ;

我怀疑这是否有效,但您可以与其他版本一起测试。

于 2013-06-27T22:41:14.783 回答
1

对于不在两个表中的用户,您可以使用左连接而不是内连接,然后测试是否为空。

例子:

SELECT a.member_id 
FROM records a
  LEFT JOIN records b ON  a.member_id = b.member_id
                      AND b.registered_year = '2013' 
WHERE a.registered_year = '2012' 
  AND b.registered_year IS NULL;
于 2013-06-27T22:21:25.720 回答