1

私は3つのテーブルを持っています:

写真: ID、名前

キーワード: ID、キーワード

photo_keyword 関係テーブル: photo_id、keyword_id

つまり、1 枚の写真が、その写真を説明する複数のキーワードに関連付けられている可能性があります。

photos:
id | name
1  | photo 1
2  | photo 2
3  | photo 3

keywords:
id | keyword
1  | NHL
2  | Toronto
3  | Montreal
4  | Boston
5  | Chicago
6  | Canadiens
7  | Leafs


photo_keyword:
photo_id | keyword_id
1 | 2
1 | 7
1 | 1
2 | 1
2 | 3
2 | 6
3 | 2
3 | 7

要求されたすべての基準を満たす写真のリストを取得できるクエリを動的に作成/構築したいと思います。

例: トロント (2) とリーフス (7) をキーワードとして含むすべての写真が必要です

ie) 写真 1 と写真 3 は、両方のキーワードを持つ 2 つであるため、検索したい

NHL (1) トロント (2) とリーフス (7) を基準として写真を要求すると、写真 1 のみが返されます。

明らかな最初の試みには、テーブルの結合が含まれていました。

SELECT photo.id, photo.name
FROM photo
LEFT JOIN photo_keyword ON photo_keyword.photo_id = photo.id
LEFT JOIN keyword ON keyword.id = photo_keyword.keyword_id
WHERE keyword.keyword = 'Toronto'

写真 1 と 2 を返します

このタイプのクエリは、1 つのキーワード条件を満たすすべての写真を検索するときにいつでも使用できます。ただし、2 つのキーワードの条件を満たす写真を取得しようとすると、話は別です。

私は試した

 WHERE keyword.keyword IN ('NHL, 'Toronto', 'Leafs') 

ただし、どちらかの基準を満たす写真が返されますが、必ずしも両方とは限りません。この場合、写真1と2も同様です。

では、すべてのキーワード基準を満たす写真のみを返すクエリを作成するにはどうすればよいでしょうか?

これに関するヘルプは非常に高く評価されます!

アップデート:

みんなのコメントで、これは私がまとめたものであり、私が必要とすることをしているようです:

SELECT
    photos.id
FROM photos
LEFT JOIN photo_keyword pk ON pk.photo_id = photos.id
LEFT JOIN keywords kw ON kw.id = pk.keyword_id
WHERE kw.keyword IN ('NHL', 'Toronto', 'Leafs')
GROUP BY photos.id
HAVING COUNT(kw.keyword) = 3;
4

2 に答える 2

1

このクエリを試してください -

SELECT p.id, p.name FROM photo_keyword pk
  JOIN keywords k
    ON k.id = pk.keyword_id
   JOIN photos p
     ON p.id = pk.photo_id
GROUP BY
  pk.photo_id
HAVING 
  COUNT(IF(k.keyword = 'Toronto', 1, NULL)) > 0 AND
  COUNT(IF(k.keyword = 'Leafs', 1, NULL)) > 0
于 2013-01-30T07:31:02.693 に答える
1

特定の写真でキーワードを繰り返すことができないことがわかっている場合は、次のような方法でこれを達成できると思います。

SELECT photo.name from photo where photo.id IN (
SELECT photo.id
FROM photo
LEFT JOIN photo_keyword ON photo_keyword.photo_id = photo.id
LEFT JOIN keyword ON keyword.id = photo_keyword.keyword_id
WHERE keyword.keyword IN ('NHL, 'Toronto', 'Leafs')
GROUP BY (photo.id)
HAVING COUNT (photo.name) = *Number of passed keywords*)

UNIONS などでもこれを行うことができますが、これの多くは、キーワードについて何を知っているか、およびそれらをどのように取得しているかに依存します。

于 2013-01-30T05:57:18.343 に答える