Mysql 连接两个表,同时按索引分组并为多个外部ID进行加工

Mysql 连接两个表,同时按索引分组并为多个外部ID进行加工,mysql,join,group-by,Mysql,Join,Group By,我有以下三个表格: 对象: ObjectID ObjectDescription 1 "first" 2 "second" 属性: AttributeID AttributeDescription 1 "att1" 2 "att2" 3 "att3" 4 "att4" 属性链接: AttributeID ObjectID 1 1 2 1 4

我有以下三个表格:

对象:

ObjectID ObjectDescription
1        "first"
2        "second"
属性:

AttributeID AttributeDescription
1           "att1"
2           "att2"
3           "att3"
4           "att4"
属性链接:

AttributeID ObjectID
1           1
2           1
4           1
现在我的问题是:我想选择一些属性,并想知道哪个对象具有我选择的所有属性。我尝试了以下方法:

SELECT * FROM `objects` 
    INNER JOIN `attributelink` 
         ON `objects`.`ObjectID` = `attributelink`.`ObjectID`
    WHERE `attributelink`.`AttributeID` =1 AND `attributelink`.`AttributeID` =2  
GROUP BY `objects`.`ObjectID` 

这显然不起作用,因为一行不能有2个AttributeId,但我如何存档它呢?

对于要检查的每个选定属性,您必须在
attributelink
表中加入一次:

SELECT o.ObjectID
FROM objects o
INNER JOIN attributelink a1 ON o.ObjectID = a1.ObjectID AND a1.AttributeID = 1
INNER JOIN attributelink a2 ON o.ObjectID = a2.ObjectID AND a2.AttributeID = 2
GROUP BY o.ObjectID
您的测试数据并没有显示它是否有效,但是FWIW


另一种方法是使用
COUNT DISTINCT
have
GROUP BY
():


如果选择2个属性,那么您希望对象列出具有这两个属性的对象吗?因此,在WHERE子句中,使用这两个属性。然后使用GROUP BY函数对对象进行分组,以获取计数(属性)=2的对象
SELECT o.ObjectID
FROM objects o
INNER JOIN attributelink a ON o.ObjectID = a.ObjectID
WHERE a.AttributeID IN (1,2) --here you filter the rows on the attributes to test
GROUP BY o.ObjectID
HAVING COUNT(DISTINCT(a.AttributeID)) = 2 --# of attributes, means "having ALL"