これらのモックアップ テーブルを使用して、多対多の関係のケースを単純化しました。
Posts:
------------------------------
| id | title | body |
------------------------------
| 1 | One | text1 |
| 2 | Two | text2 |
| 3 | Three | text3 |
------------------------------
Tags:
-------------------
| id | name |
-------------------
| 1 | SQL |
| 2 | GLSL |
| 3 | PHP |
-------------------
Post_tags:
------------------------------
| id | p_id | t_id |
------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 2 | 1 |
| 3 | 3 | 2 |
------------------------------
私の目標は、問題のない特定の TAGS を使用して POSTS をクエリすることですが、クエリしたタグだけでなく、投稿に関連するすべてのタグも表示したいと考えています。私のクエリは次のようになります。
SELECT p.Title, p.Body, t.name
FROM Posts p
LEFT JOIN Post_tags pt ON p.id = pt.p_id
LEFT JOIN Tags t ON t.id = pt.t_id
WHERE t.name LIKE '%SQL%'
これは「SQL」タグを持つ投稿を取得しますが、「SQL」文字列が見つかったタグで投稿テーブルを結合するだけなので、投稿に関連付けられた他のタグ「PHP」は結合されません。
明らかに問題は、WHERE 句でテーブルを結合していることですが、これを 1 つのクエリまたは (できればサブクエリで) 解決するにはどうすればよいでしょうか?
現在、アプリケーションの 2 つの個別のクエリでこれを行っています。1 つは一致する投稿を選択するためのもので、もう 1 つは完全な投稿データを取得するためのものです。これはあまり効率的ではなく、不十分な解決策のようにも思えます。私はまだより良い方法を見つけていないので、StackOverflow コミュニティに問い合わせることにしました。