MySQL查询查找跨多行匹配

时间:2014-03-06 23:19:57

标签: mysql sql database

我有两个表,Data(Name, dataID)Attributes(Name, attributeID, dataID),一对多的关系。一个dataID可能与许多attributeID相关联。

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

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

那将使用这些属性中的任何一个获取所有dataID,我希望dataID具有所有这些属性。

建议?

仍然围绕使用超过非常基本的选择的查询。

2 个答案:

答案 0 :(得分: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)

可以使用GROUP BY解决方案。

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

答案 1 :(得分: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;