0

SQL クエリで問題が発生しました... 3 つのテーブル (Images、Tags、Image_Tag) があります。

画像

Image_ID  |  Image_Path
1            img1.png
2            img2.png
3            img3.png

タグ

Tag_ID    |  Name
1            Tag 1
2            Tag 2
3            Tag 3

画像_タグ

Image_ID  |  Tag_ID
1            2
2            3
3            1
3            2

ご覧のとおり、3 番目の画像には Tag1 と Tag2 の 2 つのタグがあります。渡されたすべてのタグを持つ画像を選択するクエリを作成したいと思います。

たとえば、タグ 2を指定すると、画像 #1 と #3 が表示されますが、タグ 1を追加すると、画像 #3 のみが表示されます。

IN条件を使用しようとしましたが、タグに一致するすべての結果が返されます。

アイデアはありますか?ありがとうございました。

4

2 に答える 2

1
SELECT  DISTINCT a.*
FROM    Images a
        INNER JOIN Image_Tag b
            ON a.Image_ID = b.Image_ID
        INNER JOIN Tags c
            ON b.Tag_ID = c.Tag_ID
WHERE   c.Name IN ('Tag2')

結合についてさらに詳しく知りたい場合は、以下のリンクにアクセスしてください。

更新 1

SELECT  a.*
FROM    Images a
        INNER JOIN Image_Tag b
            ON a.Image_ID = b.Image_ID
        INNER JOIN Tags c
            ON b.Tag_ID = c.Tag_ID
WHERE   c.Name IN ('Tag1','Tag2')
GROUP   BY a.Image_ID, a.Image_Path
HAVING  COUNT(*) = 2
于 2013-03-03T05:24:04.280 に答える
0

JWの回答の後に質問が編集されたのだろうHAVINGCOUNT. 私は彼の答えから始めています。このバージョンは、任意の数のタグに対して機能し、そのすべてが画像に一致する必要があります。

SELECT  a.Image_ID, a.Image_Path
FROM    Images a
    INNER JOIN Image_Tag b
        ON a.Image_ID = b.Image_ID
    INNER JOIN Tags c
        ON b.Tag_ID = c.Tag_ID
GROUP BY a.Image_ID, a.Image_Path
HAVING   COUNT(*) = (SELECT COUNT(*) FROM Tags)

Nameまたは SQL のその他の予約語を列名として使用しないことをお勧めします。そして、私Nameはユニークだと思います。すべての RDBMS で が許可されるSELECTわけHAVINGではありませんが、メイン クエリとは関連付けられていません。それらについては、次のようなものを試すことができます

SELECT  a.Image_ID, a.Image_Path, c.Tag_ID
FROM    Images a
    INNER JOIN Image_Tag b
        ON a.Image_ID = b.Image_ID
    LEFT JOIN Tags c     -- Note change to an OUTER JOIN!
        ON b.Tag_ID = c.Tag_ID
GROUP BY a.Image_ID, a.Image_Path
HAVING   COUNT(*) = COUNT(c.Tag_ID)
于 2013-03-04T08:00:00.677 に答える