2016-02-17 89 views
2

我有一個包含id和版本號(以及其他幾個字段)的表,我想對與我所知的id和版本不匹配的所有行進行查找。基於SQL中的兩個同步數組選擇數據

我試過這樣的事情,但它不是我想要的。

SELECT * FROM table WHERE id NOT IN (1,2,3) AND version NOT in (4,5,6); 

上面的查詢看起來像這樣的工作:

SELECT * FROM table WHERE id != 1 AND version != 4; 
SELECT * FROM table WHERE id != 1 AND version != 5; 
SELECT * FROM table WHERE id != 1 AND version != 6; 
SELECT * FROM table WHERE id != 2 AND version != 4; 
SELECT * FROM table WHERE id != 2 AND version != 5; 
SELECT * FROM table WHERE id != 2 AND version != 6; 
SELECT * FROM table WHERE id != 3 AND version != 4; 
SELECT * FROM table WHERE id != 3 AND version != 5; 
SELECT * FROM table WHERE id != 3 AND version != 6; 

我真正想要的是什麼,是使用相同的數組鍵爲兩個列表,像這樣:

SELECT * FROM table WHERE id != 1 AND version != 4; 
SELECT * FROM table WHERE id != 2 AND version != 5; 
SELECT * FROM table WHERE id != 3 AND version != 6; 

所以這數據集只返回第二行。

id | version 
------------ 
1 | 4 
2 | 7 
3 | 6 

我試圖尋找SQL文檔像一個for循環,而不能真正找出是否存在以及它是如何工作的。

+0

這句法後一些更多的閱讀使我在這裏:http://stackoverflow.com/questions/13426203/MySQL的知識到體選-行與 - 多對合where子句。有一些關於優化和更大的數據集的好建議。希望它能幫助別人。 – Neograph734

回答

4

這應該工作:

SELECT * FROM table WHERE (id, version) not in ((1,4), (2,5)) 

更新:

這裏有一個小提琴:http://sqlfiddle.com/#!9/b3284b/1

+0

謝謝!爲了匹配我的例子,我做了如下查詢:'SELECT * FROM table WHERE(id,version)not in((1,4),(2,5),(3,6))',並且返回第2行爲預計(2,7)。 – Neograph734

+0

我希望SQL Server可以做到這一點,而不會進入心臟驟停 – Brandon

+0

@Brandon這是我的理解,這將比加載所有結果,並在PHP中的每一行循環。我錯了嗎? – Neograph734