3 つのテーブル、 posts 、 tags 、および post_tags があります。投稿とタグは多対多の関係にあります。
posts table
+----+------------------------------------------------------+
| id | title |
+----+------------------------------------------------------+
| 1 | title1 |
| 2 | title2 |
| 3 | title3 |
+----+------------------------------------------------------+
post_tags table
+----+---------+--------+
| id | post_id | tag_id |
+----+---------+--------+
| 1 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 1 | 4 |
| 4 | 2 | 2 |
| 5 | 2 | 4 |
| 6 | 2 | 5 |
| 7 | 2 | 6 |
| 8 | 3 | 3 |
| 9 | 3 | 4 |
| 10 | 3 | 5 |
+----+---------+--------+
したがって、tag_id に基づいて投稿を見つける必要があります。タグが 1 つしかない場合、解決策は簡単に思えます。
SELECT posts.id, posts.title
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id
AND post_tags.tag_id = 2
そのため、post_tags テーブルに tag_id 2 を持つ投稿のみを取得します。したがって、tag_id 2 と 3 を同時に持つ投稿のみを取得したいと考えています。つまり、いくつかの投稿の tag_id が 2 で 3 でない場合、これらはフェッチされるべきではありません。どうすればそれを達成できますか?
私はこれを試しました
SELECT posts.id, posts.title
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id
AND post_tags.tag_id = 2
AND post_tags.tag_id = 3
しかし、それは空を返します。同じtag_idフィールドに対して2つの条件を作成しているように見えるので、その理由を理解できると思います。
アップデート:
このクエリは、tag_id が 2 OR 3 で、2 AND 3 が必要なすべての投稿を返します
SELECT posts.id, posts.title
FROM posts
INNER JOIN post_tags
ON posts.id = post_tags.post_id AND post_tags.tag_id IN (2,3);
ありがとう