0

次の単純なテーブル構造を使用します。

Data
----------
id

Tag
----------
id

TaggedData
----------
id
tag_id
data_id

タグ ID のリストがある場合、リスト内のタグのすべての行が一致するデータの行と関係があり、そのサブセットではない場合、データのすべての行を取得するにはどうすればよいですか?

これが私が今持っている、うまくいかないクエリです:

    SELECT
        Data.*

    FROM
        Data
    LEFT JOIN
        TaggedData ON (Data.id = TaggedData.data_id)
    LEFT JOIN
        Tag ON (Tag.id = TaggedData.tag_id)

    WHERE
        Tag.id IN ('1' , '2')

具体的には、タグ 1 または 2 に関連するデータの行を返すため、これは機能しません。12 ではありません。

4

1 に答える 1

1

これを「関係分断」といいます

   SELECT 
        Data.ID  
    FROM 
        Data 
    INNER JOIN 
        TaggedData ON (Data.id = TaggedData.data_id) 
    INNER JOIN 
        Tag ON (Tag.id = TaggedData.tag_id) 
    WHERE 
        Tag.id IN ('1' , '2') 
    HAVING COUNT(DISTINCT tag.iD)=2
于 2012-10-03T15:26:44.630 に答える