2014-07-24 69 views
3

嗨,我有一个小问题,我找不到解决方案。我在MySql中很新。WHERE和AND在MySQL查询

比方说我有这个表:

_______________ 
|prodID| |propID| 
|________|______| 
| 1 | 2 | 
| 1 | 5 | 
| 2 | 6 | 
| 2 | 7 | 
| 3 | 5 | 
| 3 | 2 | 
| 3 | 9 | 
| 4 | 5 | 
| 4 | 3 | 
| 5 | 2 | 
| 5 | 5 | 
|________|______| 

PRODID是Product-ID和PROPID是物业-ID。
现在我想要的产品,例如具有属性propID = 2 和属性propID = 5。如果propID = 2中的财产是“由玻璃制成”且propID = 5是“对于儿童安全”。我希望我得到的产品(prodID)都是。 “由玻璃制成,适合儿童使用”。所以,我会得到propIDs是1,3和5

这并没有为我工作:

SELECT prodID FROM table WHERE propID=2 AND propID=5 

我希望这是清楚了我的意思,并希望有人能帮助我。

由于

编辑:

表现在更改在PRODID = 4。 如果我想尝试

SELECT prodID FROM table WHERE propID=2 OR propID=5 

我会得到1,3,4和5,但是,这不是我想要的。

+0

我没有得到玻璃和安全的儿童部分 –

+0

'在哪里PROPID = 2或propID = 5' –

+0

@先生alien例如一个婴儿奶瓶 – josepchappa

回答

5

您需要查询的是:

SELECT 
    prodID 
FROM 
    t 
WHERE 
    propID IN (2,5) 
GROUP BY 
    prodID 
HAVING 
    COUNT(DISTINCT propID)=2 

此外,请注意,它的 “正好2属性”。如果您在结果中需要“至少”属性中的“2”和“5”,则将COUNT(DISTINCT propID)=2更改为COUNT(DISTINCT propID)>=2。检查这fiddle

0

这些都将不是你更新后的工作

试试这个 SELECT DISTINCT PRODID FROM表WHERE PROPID = 2或PROPID = 5 另一种方式来做到这一点是这样的 SELECT DISTINCT PRODID FROM表WHERE PROPID IN (2,5)

编辑:

试试这个,而不是

SELECT prodID FROM table WHERE propID=2 OR propID=5 GROUP BY prodID HAVING COUNT(DISTINCT prodID) = 2 

注意:如果您要使用此查询接受AlmaDo的答案,因为它是我的建议之前。

,你可以使用子查询

SELECT prodID FROM (
SELECT prodID, COUNT(DISTINCT prodID) as filter_col FROM myTable 
WHERE propID IN(2,5) 
GROUP BY prodID 
)t 
WHERE filter_col = 2; 

DEMO

+0

我不认为这是他所需要的。他只需要propid = 2和propid = 5的产品。问题在于表格没有正常化。 – kiks73

+0

@ kiks73你看过我发布的演示了吗?它是做什么他要求 –

+0

这与OP需要 –

0

你想使用或代替去做。并且查找两个条件都返回为真的记录,在这种情况下没有。 OR将会返回其中任何一个都是真的记录。

0

既然你想这两个条件是真的OR不起作用。

解决方法是将表与itslef连接起来,然后添加where条件。

SELECT t1.prodID 
FROM table t1 
INNER JOIN table AS t2 ON t1.prodID = t2.prodID AND t2.propID = 2 
WHERE t1.propID = 5 

但是可能有更好的解决方案。

0

这也会起作用:使用子查询过滤具有一个属性的产品,然后使用其他属性过滤这些产品。 fiddle

SELECT DISTINCT T.PRODID 
FROM T INNER JOIN (SELECT PRODID FROM T WHERE PROPID=2) AS TABLE2 
ON T.PRODID = TABLE2.PRODiD 
WHERE T.PROPID = 5 
0

试试这个

SELECT prodID FROM table WHERE (propID=2 OR propID=5) 
+2

这将有助于解释为什么你的查询工作和OP的没有。 – Kryten

+0

OP特别提到这并没有给出预期的结果。 – cpburnz

+0

他的循环可能不正确。或者他没有做出循环或结果。 – ivanfromer

1

要么与counthaving,或:

select * from products 
where (
    select count(distinct propID) from pivot_table where products.ID = pivot_table.prodID 
    and pivot_table.propID IN (2,5) 
) = 2 

IN(..)一部分,= 2应该是动态的,根据您的需要。


distinct将解决重复的问题,但是@Alma做了更好的解决方案,这需要依赖无子查询简单查询。