2013-12-12 103 views
0

我想我的SQL請求採取一些行,但跳過另一個使用IN()和NOT IN()。 但這似乎不能正常工作。有人知道爲什麼嗎?我們可以在MySQL中使用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 
+3

簡答:是的。 「這不能正常工作」雖然不是有效的錯誤信息或不良行爲信息。 –

+0

嘗試在[SQL Fiddle](http://www.sqlfiddle.com/)中設置示例。通過這種方式,您可以爲我們提供一個數據樣本,以瞭解您想要做什麼並提供更好的幫助。 – AeroX

回答

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

請注意,'NOT IN'條件不是必需的。如果'id'在某些'idenvoi'中,它不能在其他的... –

+0

@ Britney Spears粉絲,是的,你是對的 –

+0

'NOT IN'在這裏不是多餘的。如果子查詢沒有使用「SELECT idenvoi」而不是「SELECT idprospect」,那隻會是多餘的,但在這種情況下,「NOT IN」部分完全可以過濾掉結果。 – hvd

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 

中聲明過濾器您的查詢僅包含ColA爲1或2的行。因此,在這種情況下,NOT IN查詢完全不合格cessary。現在,如果您編寫這樣的查詢,請改爲:

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行。

+0

+1,但解決問題的辦法是Pankaj Jawale注意到的括號問題。 –

+0

啊,是的,謝謝 - 沒有注意到。留下答案,因爲別人可能會覺得它有用:-) – Dan

相關問題