2014-03-06 121 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