2014-01-10 19 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'替换这个值。 –