1

私は3つのテーブル、画像、タグ、リンクを持っています(下の表)

   ImageNO | TagNO
     1     | Sport
     2     | Cars
     3     | Sport
     4     | Sport
     3     | Cars
     1     | Music
     2     | Sport

(明らかに、TagNO は実際のテーブルの数字になります)

私がやりたいことは、ユーザーが任意の数のタグを選択できるようにフィルタリングを許可することであり、画像はすべてのタグが選択された画像のみにフィルタリングされます。たとえば、ユーザーが「スポーツ」を選択すると、「imageNO」 1、3、4、および 2 が表示されます。ユーザーが "cars" も選択した場合、クエリは絞り込まれ、"imageNO" 3 と 2 のみが表示されます。

私はこれまで、ウェブ全体の例から多くのことを試してきましたが、これが最も近いものです...

SELECT *
 FROM  images 
  LEFT JOIN links 
   ON INO = links.INO
  LEFT JOIN tags 
   ON tags.TagNO = links. TagNO
  WHERE links. TagNO
  IN ($tags)
  GROUP BY INO
  HAVING COUNT( INO ) >1

($tags) はタグ番号の配列です。

これに関する問題は、カウント数が > 1 ではなく = 1 であるため、タグが 1 つしかない画像が表示されないことです。事前に感謝します。

4

2 に答える 2

2

この質問は同じ問題に対処していると思います。受け入れられた回答のアプローチは、おそらくあなたにも役立つでしょう。次のようなもの:

SELECT * 
FROM images i
JOIN links l ON l.INO = i.INO
JOIN tags t ON t.TagNO = l.TagNO
WHERE l.TagNO IN ('sports','cars')
GROUP BY i.INO
HAVING COUNT(DISTINCT t.TagNO) = 2

...重要なのは、COUNT(DISTINCT t.TagNO) = [number of tags]

于 2013-01-10T17:31:50.177 に答える
0

同じテーブルで複数回結合する必要があります。この目的のためにエイリアスを使用します。

SELECT * FROM images
  LEFT JOIN links AS l1 ON l1.INO = images.INO
  LEFT JOIN tags AS t1 ON t1.TagNO = l1.TagNO
  LEFT JOIN links AS l2 ON l2.INO = images.INO
  LEFT JOIN tags AS t2 ON t2.TagNO = l2.TagNO
  [...]
  WHERE t1.tagNO = $tag1
    AND t2.tagNO = $tag2
  [...]
于 2012-11-21T22:29:31.837 に答える