私がやろうとしていることを説明するには、多くの事前情報が必要です。わかりやすくするために、可能な限り一般化しようとしました。単一のクエリで、別のテーブルにリンクされているタグと一致するページのリストを取得したいと考えています。これらのタグはグループになっています。ID の代わりにアイテムのテキスト表現を使用したいと考えていますが、他に何もなければ、tag_id と taggroup_id を取得するために 2 つの事前クエリを実行できます。それを行う必要がないことを望んでいます。
DB スキーマ:
+-----------------------------------+
| taggroups |
+------------------+----------------+
| taggroup_id | group_name |
+------------------+----------------+
| 1 | fruits |
+------------------+----------------+
+-----------------------------------------------+
| tags |
+-------------+-----------------+---------------+
| tag_id | taggroup_id | tag_name |
+-------------+-----------------+---------------+
| 1 | 1 | apple |
| 2 | 1 | orange |
| 3 | 1 | grape |
+-------------+-----------------+---------------+
+--------------------------------------+
| pages |
+------------------+-------------------+
| page_id | title |
+------------------+-------------------+
| 99 | Doctor a day |
+------------------+-------------------+
+--------------------------------------------------+
| tags_to_pages |
+------------+----------+---------------+----------+
| join_id | tag_id | taggroup_id | page_id |
+------------+----------+---------------+----------+
| 1 | 1 | 1 | 99 |
| 2 | 2 | 1 | 99 |
+------------+----------+---------------+----------+
テスト クエリ: ここまでできましたが、うまく動作しないようです。
SELECT
pages.*, tags.tag_name, taggroups.group_name
FROM
tags_to_pages
INNER JOIN taggroups as grp ON (
grp.group_name = 'fruits'
AND
tags_to_pages.taggroup_id = grp.taggroup_id
)
INNER JOIN tags as val ON (val.tag_name = 'apple' AND tags_to_pages.tag_id = val.tag_id)
LEFT JOIN pages ON (tags_to_pages.page_id = pages.page_id)
さらに、どのテーブルにインデックスを付ける必要があり、最適化のためにどのインデックスを使用する必要がありますか?