2012-01-06 10 views
1

私は以下のようなSQLテーブルを持っています。そして、tag_idが複数の項目と一致する一意の結果を戻したいと思います。 だからtag_id = 106 and 73を持つimage_idのそれぞれを見つけたい場合は、image_id 12345714 and 12345712を戻したいと思います。SQLクエリ複数のタグから一意のイメージを選択

私は

SELECT * 
FROM tag_relationship 
WHERE tag_id 
IN (106, 73) 

をやってみました。しかし、これは

 id image_id tag_id 
     61 12345706 73 
     70 12345712 73 
     72 12345712 106 
     76 12345714 73 
     77 12345714 106 

に戻します私もGROUP BYを試しましたが、それはかなり右ではないようです。

フルテーブルのサンプル: image_idは異なる行で同じ番号を持つことができますが、異なるtag_idを持ちます。

 id image_id tag_id 
     1 12345679 63 
     2 12345679 83 
     3 12345680 74 
     4 12345680 108 
     5 12345680 75 
     6 12345683 103 
     7 12345682 87 
     8 12345682 105 
     9 12345682 74 
     10 12345682 81 
     11 12345683 79 
     12 12345683 109 
     13 12345689 111 
     14 12345689 69 
     15 12345690 104 
     16 12345687 110 
     17 12345687 69 
     18 12345687 91 
     19 12345687 93 
     20 12345687 63 
     21 12345692 69 
     22 12345692 104 
     23 12345692 80 
     24 12345692 76 
     25 12345693 74 
     26 12345693 99 
     27 12345693 96 
     28 12345693 94 
     29 12345691 63 
     30 12345691 69 
     31 12345697 92 
     32 12345697 76 
     33 12345698 74 
     34 12345699 97 
     35 12345698 94 
     36 12345699 98 
     37 12345698 81 
     38 12345699 105 
     39 12345697 91 
     40 12345694 100 
     41 12345694 101 
     42 12345694 94 
     43 12345694 74 
     44 12345696 78 
     45 12345696 95 
     46 12345696 112 
     47 12345701 113 
     48 12345701 114 
     49 12345700 94 
     50 12345700 91 
     51 12345700 90 
     52 12345702 87 
     53 12345702 115 
     54 12345702 80 
     55 12345702 74 
     56 12345704 78 
     57 12345705 83 
     58 12345705 84 
     59 12345704 63 
     60 12345705 104 
     61 12345706 73 
     62 12345706 64 
     63 12345706 86 
     64 12345706 88 
     65 12345706 89 
     66 12345713 80 
     67 12345713 115 
     68 12345713 81 
     69 12345717 63 
     70 12345712 73 
     71 12345717 64 
     72 12345712 106 
     73 12345717 79 
     74 12345712 74 
     75 12345709 76 
     76 12345714 73 
     77 12345714 106 
     78 12345715 68 
     79 12345716 116 
     80 12345715 69 
     81 12345716 71 
+0

を試してみてください、あなたを指定する必要がありますデータベース?私はMSSQL、MySQL PostgreSQLまたは何か他のものを意味します。 –

+0

申し訳ありませんが、他の人のためにこの投稿を参照してください他の人のためのmysql – user9418

答えて

2
SELECT image_id 
FROM  tag_relationship 
WHERE tag_id IN (106, 73) 
GROUP BY image_id 
HAVING COUNT(*) = 2 
+0

+1これが最適です。 1回のフルスキャン。 –

+0

インデックスを使用すると、複数のJOINアプローチや複数のEXISTSアプローチが高速になるかもしれません。ただし、リストにIDを追加すると、クエリ構造を変更することなく一般化する方が簡単です。 – MatBailie

+0

はい、まだインデックスを使用できます;) –

0
SELECT DISTINCT image_id 
FROM tag_relationship 
WHERE tag_id 
IN (106, 73) 
+0

私はこれも試してみましたが、返信ありがとうございましたimage_id 12345706だけのtag_id 73があるがtag_idを持っていません106 – user9418

0

それは簡単/本当に愚かなことかもしれませんが、私はこれがうまくいくと思う:

SELECT image_id 
FROM tag_relationship 
WHERE 
    tag_id = 106 AND tag_id = 73 
+0

申し訳ありませんどちらもうまくいきませんでした。結果を返さなかった。とにかくありがとう:) – user9418

+0

ああ、それは間違っている、一瞬待つ... –

+1

@TonyAlanこのクエリは、テーブルの行が 'tag_id = 106と73 'を同時に持つことができないため、行を返しません。 –

0

は多分これ

SELECT DISTINCT t1.image_id 
FROM tag_relationship t1 
    JOIN tag_relationship t2 ON t1.image_id=t2.image_id 
WHERE t1.tag_id=106 
     and t2.tag_id=73 
関連する問題