1

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);

ありがとう

4

3 に答える 3

1

あなたはこのようにすることができます

SELECT p.id, p.title 
  FROM post p JOIN post_tags t
    ON p.id = t.post_id
 WHERE t.tag_id IN (2, 3)
 GROUP BY p.id, p.title
HAVING COUNT(DISTINCT t.tag_id) = 2 

出力:

| | ID | タイトル |
---------------
| | 1 | タイトル1 |

これがSQLFiddleのデモです

于 2013-08-02T06:27:25.713 に答える