2

image、tag、image_tag_link の 3 つのテーブルがあります。

  • 画像には画像データが含まれており、image_id (pk)
  • タグにはタグが含まれており、tag_id (pk)
  • image_tag_linkと で 2 つを結合しimage_idますtag_id (fk)

特定のタグ ID のリストに関連するすべてのタグを取得したいと考えています。たとえば、特に 2 つのタグを共有する 3 つの画像がある場合、特定のフィルターに対してそれらの 2 つのタグ (すべて共通のもの) のみを取得したいと考えています。

私は現在使用しています(リンクテーブルを使用するだけに簡略化されています):

select itl1.tag_id
from image_tag_link itl1 
inner join image_tag_link itl2 on itl2.image_id = itl1.image_id
where itl2.tag_id in (:list_of_tag_ids)
group by itl1.tag_id;

ただし、これにより、フィルター基準を満たすすべての画像のすべてのタグが得られます。

どんな助けでも大歓迎です。

4

2 に答える 2

0

最後に、マヌの答えに関連する解決策を見つけました。確かに必要ですHAVING COUNT(DISTINCT ) > no_of_tagsが、私の問題はタグと同様に画像のグループ化に関係していたので、最終結果は次のとおりです。

select itl1.tag_id
from image_tag_link itl1
inner join image_tag_link itl2 on itl2.image_id = itl1.image_id
where itl2.tag_id in (:list_of_tags)
group by itl1.tag_id, itl1.image_id
having count(distinct itl2.tag_id) = no_of_tags;

マヌとゴードンの助けに感謝します。

于 2013-08-02T14:28:21.020 に答える
0

これは、集計を使用して行うことができます。アイデアは、フィルターに一致するすべての画像を取得することです。次に参加して、それらの画像のすべてのタグを取得します。以下は、カウントの降順でタグを返します。

select itl.tag_id, count(*) as numtags
from image_tag_link itl join
     (select distinct image_id
      from image_tag_link 
      where tag_id in (:list_of_tag_ids)
     ) i
     on itl.image_id = i.image_id
group by itl.tag_id
order by numtags desc;

以下はさらに一歩進んで、すべての画像の画像のみを返します。

select itl.tag_id, count(*) as numtags
from image_tag_link itl join
     (select distinct image_id
      from image_tag_link 
      where tag_id in (:list_of_tag_ids)
     ) i
     on itl.image_id = i.image_id cross join
     (select count(distinct image_id) as cnt
      from image_tag_link 
      where tag_id in (:list_of_tag_ids)
     ) NumImages
group by itl.tag_id
having numtags = max(NumImages.cnt);
于 2013-07-25T17:35:41.660 に答える