これらのモックアップテーブルを使用して多対多リレーションのケース を簡略化しました。同じリレーションでフィルタリングして多対多の結合をクエリするにはどうすればよいですか?
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 |
------------------------------
私の目標は、私がして何の問題もない特定のタグ付きの記事を照会することですが、私はまた私が照会だけでなくつのポストに関連するすべてのタグを表示します。
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つの別々のクエリで、一致する投稿と完全な投稿データを取得している別のクエリを選択しています。これはあまり効率的ではなく、不自由な解決策のようにも思えますが、私はまだ見つけていないので、StackOverflowコミュニティに尋ねることにしました。個別の内部に入れて
私の質問に答える時間をいただきありがとうございます。あなたのソリューションはこの問題を解決しますが、@Michealは受け付けています。 – dropout