我们可以在MySQL中使用IN()AND NOT IN()吗?

时间:2013-12-12 10:34:03

标签: mysql

我希望我的SQL请求占用一些行,但是使用IN()AND NOT IN()跳过另一行。 但这似乎不能正常工作。有人知道为什么吗?

谢谢!

SELECT *
FROM   `prospect`
WHERE  id IN (SELECT idprospect
              FROM   envoi_prospect
              WHERE  idenvoi IN ( '1', '2', '3', '4',
                                  '6', '7', '10', '12' )
       AND id NOT IN (SELECT idprospect
                      FROM   envoi_prospect
                      WHERE  idenvoi IN ( '8', '9', '11', '13' ))
ORDER  BY `date` DESC
LIMIT  0, 30 

2 个答案:

答案 0 :(得分:1)

你错过了放置支架的信息:

SELECT *
FROM   `prospect`
WHERE  id IN (SELECT idprospect
              FROM   envoi_prospect
              WHERE  idenvoi IN ( '1', '2', '3', '4',
                                  '6', '7', '10', '12' ))
       AND id NOT IN (SELECT idprospect
                      FROM   envoi_prospect
                      WHERE  idenvoi IN ( '8', '9', '11', '13' ))
ORDER  BY `date` DESC
LIMIT  0, 30 

您可以将查询重写为:

    SELECT *
        FROM   `prospect`
        WHERE  id IN (SELECT idprospect
                      FROM   envoi_prospect
                      WHERE  idenvoi IN ( '1', '2', '3', '4',
                                          '6', '7', '10', '12' ) And
                             idenvoi NOT IN ( '8', '9', '11', '13' ) )
    ORDER  BY `date` DESC
    LIMIT  0, 30 

答案 1 :(得分:1)

虽然SQL语法肯定允许它,但同时应用IN过滤器和NOT IN过滤器并没有多大意义。

考虑一个包含以下记录的表:

ColA
1
2
3
4

如果你写这样的查询:

SELECT * FROM MyTable 
WHERE
    ColA IN (1, 2) AND
    ColA NOT IN (4)

输出将是:

ColA
1
2

IN语句将查询过滤为仅包含ColA为1或2的行。因此,在这种情况下,完全不需要NOT IN查询。现在,如果您编写这样的查询:

SELECT * FROM MyTable
WHERE
    ColA IN (1, 2, 3) AND
    ColA NOT IN (3, 4)

输出与上面相同。为什么?好吧,既然在IN和NOT IN语句之间有一个AND运算符,两者都必须求值为TRUE,才能输出一个记录。现在,对于表中的第3行,ColA IN (1, 2, 3)的计算结果为TRUE,但ColA NOT IN (3, 4)的计算结果为FALSE,因此不输出第3行。