2012-11-08 61 views
2

我很感谢任何帮助创建此查询。我尝试了几种方法,但没有运气。由于我的问题对我来说有点困难,我会举一个我想做的事情的简单例子。我有一个在结构上类似于下面的数据:Mysql查询找到一个列满足多个条件的ID

ID TYPE COLOR 
1 A  Blue 
1 B  Red 
1 C  Green 
2 C  Blue 
2 B  Green 

我想,如果我有两个特定颜色的ID来创建一个查询返回的类型。例如,我想找到所有同时具有蓝色和红色的ID。该查询然后将返回:

1, A , B 

A和B返回的顺序并不重要。数据集很大,我预计很多ID都可以匹配这两个条件(大约5万个左右)。我应该注意,这种类型与颜色无关,因此使问题与this other stackoverflow question,as well as this one不同。

我想我需要做一些子查询。但真的不知道该怎么做,谢谢。

+0

如果您需要提出未来的问题,将示例数据和结构放在一起总是一个好主意! – Laurence

回答

5
SELECT ID, TYPE FROM types NATURAL JOIN (
    SELECT ID FROM types GROUP BY ID HAVING SUM(COLOR='Red') AND SUM(COLOR='Blue') 
) t WHERE COLOR IN ('Red', 'Blue') 

请参阅sqlfiddle

另外,如果你很高兴有连接成一个分隔字符串类型,你可以在一个单次提取所需的数据:

SELECT ID, GROUP_CONCAT(TYPE) 
FROM  types 
WHERE COLOR IN ('Red', 'Blue') 
GROUP BY ID 
HAVING COUNT(*) = 2 

看到它的sqlfiddle

请注意,如果您的表可能包含具有相同(ID, COLOR)对的多个记录,那么应该用替代COUNT(*)

+0

你可以在MySQL中对布尔表达式('color ='Red'')进行求和?这是如何定义的?我的意思是,总结三个“假”和两个“真”值的结果是什么? –

+0

@a_horse_with_no_name:布尔表达式的计算结果为1,如果为true,则返回0;否则返回0。因此,如果没有组员匹配,则得出总和为零,如果至少有一名成员匹配,则总和为非零;使用'HAVING'子句中的结果再次转换回布尔值。在你的例子中,结果是'0 + 0 + 0 + 1 + 1 = 2'。 – eggyal

+0

所以MySQL没有“真正的”布尔值? (因为'0'和'1'是**不是**布尔值)。 –

相关问题