SQL。根据一个字段从结果中删除一些行

时间:2012-11-08 15:03:41

标签: mysql database

发出这个sql请求后:

SELECT user.id, campaign_id, user_id
FROM `user`
LEFT OUTER JOIN `email_solus`
ON email_solus.user_id=user.id

我有这张桌子。

id campaign_id user_id
------ ----------- ---------
 1   3         1
 1   5         1
 1   6         1
 2 (NULL) (NULL)
 3 (NULL) (NULL)
 4 (NULL) (NULL)
 5 (NULL) (NULL)
 7 (NULL) (NULL)
 8 (NULL) (NULL)
 9 (NULL) (NULL)
10 (NULL) (NULL)
12 (NULL) (NULL)
13 (NULL) (NULL)
14 (NULL) (NULL)
15 (NULL) (NULL)
16 (NULL) (NULL)
17 (NULL) (NULL)

我想要做的是取消选择campaign_id = 3的所有元素,以及所有常见ID。在这种情况下,我需要删除id = 1的所有元素,并使用如下表格:

id campaign_id user_id
------ ----------- ---------
 2 (NULL) (NULL)
 3 (NULL) (NULL)
 4 (NULL) (NULL)
 5 (NULL) (NULL)
 7 (NULL) (NULL)
 8 (NULL) (NULL)
 9 (NULL) (NULL)
10 (NULL) (NULL)
12 (NULL) (NULL)
13 (NULL) (NULL)
14 (NULL) (NULL)
15 (NULL) (NULL)
16 (NULL) (NULL)
17 (NULL) (NULL)

3 个答案:

答案 0 :(得分:3)

SELECT user.id, campaign_id, user_id
FROM user
LEFT JOIN email_solus
ON email_solus.user_id=user.id
WHERE user.id NOT IN
(
    SELECT user_id
    FROM email_solus
    WHERE campaign_id = 3
)

答案 1 :(得分:2)

您可以使用NOT EXISTS进行过滤,如下所示:

SELECT user.id, campaign_id, user_id
FROM `user`
LEFT OUTER JOIN `email_solus` ON email_solus.user_id=user.id
WHERE NOT EXISTS (
    SELECT * FROM `email_solus` es WHERE es.user_id=user_id AND es.campaign_id=3
)

答案 2 :(得分:0)

SELECT user.id, campaign_id, user_id
FROM `user`
LEFT OUTER JOIN `email_solus`
ON email_solus.user_id=user.id
where user.id not in
  (select user.id from 'user'
  where campaign_id = 3)

应该有效,但如果你有一个大型数据集,那么'不在'可能效率低下