0

次の 3 つのテーブルがあります。

オブジェクト:

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` 

1 つの行に 2 つの AttributeID を含めることはできないため、これは明らかに機能しませんが、どうすればこれをアーカイブできますか?

4

1 に答える 1

1

attributelinkチェックする選択した属性ごとに、テーブルに 1 回参加する必要があります。

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、ここに sqlfiddle があります。


それを行う別の方法は、 and ( sqlfiddle )を使用COUNT DISTINCTすることです。HAVINGGROUP BY

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"
于 2012-07-26T17:23:39.757 に答える