私は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;