ドキュメント、ドキュメント タグ、および多対多の関係テーブル (ドキュメントの ID とタグの ID) の 3 つの MySQL テーブルがあります。
Document
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
DocumentToTag
+------+------+
|idDoc |idTag |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
| 4 | 4 |
+------+------+
Tag
+------+-------+
| id | value |
+------+-------+
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
| 4 | 42 |
+------+-------+
たとえば、特定の値を持つ 2 つ (またはそれ以上) のタグを持つドキュメントを取得する必要があります。次の JOIN クエリを使用します。
SELECT DISTINCTROW
Document.id
FROM Document
LEFT JOIN DocumentToTag AS dt1 ON dt1.idDoc = Document.id
LEFT JOIN Tag AS tag1 ON dt1.idTag = tag1.id
LEFT JOIN DocumentToTag AS dt2 ON dt2.idDoc = Document.id
LEFT JOIN Tag AS tag2 ON dt2.idTag = tag2.id
WHERE tag1.value = 'someTagValue'
AND tag2.value = 'someOtherTagValue'
この場合、条件に追加する必要があるタグと同じ数の JOIN を実行する必要があります。そのため、クエリはスクリプトによって動的に作成される必要があります。それに対処するよりエレガントな方法はありますか?