Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询跨多行查找匹配项_Mysql_Sql_Database - Fatal编程技术网

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不是我们需要的。谢谢您的建议。我可以让两者都工作,但在我相当大的数据集上,它们的速度相当慢。尽管如此,看看你是如何做到这一点的还是很有帮助的,向我展示了其他可能的方法。最后去掉支架。这就成功了。我认为解决方案将涉及一个连接,但不确定它将如何格式化。这给我指明了方向。谢谢