2014-01-10 21 views
1

我想在where語句的列中搜索。所以,我的數據庫是這樣的:在1列中搜索在哪裏和語句

CREATE TABLE test 
    (
zID varchar(20), 
tID varchar(30) 
); 

INSERT INTO test 
(zID, tID) 
VALUES 
('1','1'), 
('1','2'), 
('2','1'), 
('2','2'), 
('3','1'); 

,然後我用下面的SQL語句來進行搜索:

SELECT * from test where tID = 1 and tID = 2 

所以,當我把這個查詢應該返回12但不是3所有這一切是zIDs,我曾嘗試使用in但這將返回所有zIDs。這不是我想要的,所以我的問題是如何使用和搜索?

改爲使用in,而不是使用or

下面有一個fiddle

+0

爲什麼不乾脆用'zID'搜索呢? – Yuck

+0

@Yuck那麼這將是一個我將搜索的幾個表中,但這是我試圖獲得解決方案的第一步 – user3144542

回答

1

與此技巧是使用一個COUNT()集合體驗證當經由IN()子句過濾DISTINCT tIDzID每羣的總數目等於2。

SELECT zID 
FROM test 
/* Limit rows to tID 1,2 
WHERE tID IN (1,2) 
GROUP BY zID 
/* Verify that the total DISTINCT number of tID 
    per group of zID is 2, that way you know *both* 
    values are present. 
    Substitute the total number of values in the IN() for the comparison 
    against COUNT() (substitute for 2 here) to do this dynamically 
*/ 
HAVING COUNT(DISTINCT tID) = 2 

The updated fiddle

以上只返回zID,但它可以擴展到返回使用JOIN或其他IN()子句中的所有列。

/* Get all columns for the zID returned inside */ 
SELECT * FROM test WHERE zID IN (
    SELECT zID 
    FROM test 
    WHERE tID IN (1,2) 
    GROUP BY zID 
    HAVING COUNT(DISTINCT tID) = 2 
) 

或者用JOIN

SELECT test.* 
FROM 
    test 
    INNER JOIN (
     SELECT zID 
     FROM test 
     WHERE tID IN (1,2) 
     GROUP BY zID 
     HAVING COUNT(DISTINCT tID) = 2 
    ) tz ON test.zID = tz.zID 
+0

啊我可以問一下,如果它是動態的,這仍然會以類似的方式嗎? ?所以說,我不知道數組中的項目數量,如果我可以問的話,所有東西都會處於相同的佈局。編輯:我想我明白了,count是我假設的數組的數量? – user3144542

+1

@ user3144542是的,「COUNT()」值與IN()子句中源自數組的值的數量進行比較。只要你知道你的數組有多長(你應該可以知道這個),在'HAVING COUNT(DISTINCT tID)= 2'中用'2'替換這個值。 –