MySQL查询跨多行查找匹配项
我有两个表,MySQL查询跨多行查找匹配项,mysql,sql,database,Mysql,Sql,Database,我有两个表,Data(Name,dataID)和Attributes(Name,attributeID,dataID)具有一对多关系。一个dataID可能与多个attributeID相关联 我要做的是运行一个查询,查找具有一组特定AttributeId的所有DataId。我做不到: SELECT dataID FROM Attributes WHERE dataID = 1 AND (attributeID = 1 OR attributeID = 2 OR attributeID = 3);
Data(Name,dataID)
和Attributes(Name,attributeID,dataID)
具有一对多关系。一个dataID
可能与多个attributeID
相关联
我要做的是运行一个查询,查找具有一组特定AttributeId的所有DataId。我做不到:
SELECT dataID
FROM Attributes
WHERE dataID = 1 AND (attributeID = 1 OR attributeID = 2 OR attributeID = 3);
这将获取具有这些属性中任何一个的所有dataID,我想要具有所有这些属性的dataID
建议
我仍然在思考使用比基本选择更多的查询。虽然这是一个蛮力解决方案,但使用
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)
可以使用分组方式解决方案
SELECT dataID
FROM Attributes
WHERE dataID = 1 AND (attributeID = 1 OR attributeID = 2 OR attributeID = 3)
GROUP BY dataID
HAVING COUNT(*) = 3
由于您需要阅读属性表的三行不同的内容,我建议使用连接,以避免子查询
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;
我相信你把桌子倒过来了。从数据
中获取,其中有类型1和类型2的匹配属性
。请注意,您的EXISTS
子句中需要D.DataID=A.DataID
。@JonofAllTrades谢谢,现在已修复。不完全是,您现在加入了属性
。@JonofAllTrades不是我们需要的。谢谢您的建议。我可以让两者都工作,但在我相当大的数据集上,它们的速度相当慢。尽管如此,看看你是如何做到这一点的还是很有帮助的,向我展示了其他可能的方法。最后去掉支架。这就成功了。我认为解决方案将涉及一个连接,但不确定它将如何格式化。这给我指明了方向。谢谢