2014-03-06 125 views
0

我有两个表,Data(Name, dataID)Attributes(Name, attributeID, dataID)与一对多的关系。一个dataID可能与许多attributeID关联。MySQL查询查找多行匹配

我想要做的是运行一个查询,查找所有具有一组特定ID的数据ID。我不能这样做:

SELECT dataID 
FROM Attributes 
WHERE dataID = 1 AND (attributeID = 1 OR attributeID = 2 OR attributeID = 3); 

这将抓住所有dataID的任何一个属性,我想拥有所有这些属性的dataID。

对此提出建议?

仍然使用超过非常基本的选择包围我的头。

回答

1

当你需要阅读Attributes表中的三个不同行,我建议使用JOIN的避免子查询。

SELECT a1.dataID 
FROM 
    Attributes a1 
    JOIN Attributes a2 ON 
     a1.dataID=a2.dataID 
    JOIN Attributes a3 ON 
     a2.dataID=a3.dataID 
WHERE 
    a1.dataID = 1 AND 
    a1.attributeID = 1 AND 
    a2.attributeID = 2 AND 
    a3.attributeID = 3; 
+0

最后取下支架。 – user2989408

+0

这个伎俩。我认为解决方案会涉及一个加入,但不知道它将如何格式化。这给我指明了方向。谢谢。 – thechrisroberts

1

虽然这是一个蛮力解决方案,但它将使用EXISTS。等待更好的解决方案。

SELECT a.dataID 
FROM DataID a WHERE a.dataID = 1 
    AND EXISTS (SELECT 1 FROM Attributes d WHERE d.DataID = 1 AND d.attributeID = 1) 
    AND EXISTS (SELECT 1 FROM Attributes d WHERE d.DataID = 1 AND d.attributeID = 2) 
    AND EXISTS (SELECT 1 FROM Attributes d WHERE d.DataID = 1 AND d.attributeID = 3) 

A GROUP BY解决方案是可能的。

SELECT dataID 
FROM Attributes 
WHERE dataID = 1 AND (attributeID = 1 OR attributeID = 2 OR attributeID = 3) 
GROUP BY dataID 
HAVING COUNT(*) = 3 
+0

我相信你有表倒退。从'Data'获得类型1和类型2匹配的'Attribute'。注意,在'EXISTS'子句中需要'D.DataID = A.DataID'。 – 2014-03-06 23:47:18

+0

@JonofAllTrades谢谢,现在修复它。 – user2989408

+0

不是,你现在正在加入'Attributes'自己。 – 2014-03-06 23:56:14