- 締切済み
クエリの短縮化及び高速化について
カテゴリ表(カテゴリID,大カテゴリ,カテゴリ名,親カテゴリ) データ表(データID,データ,カテゴリID) ※カテゴリ表のカテゴリID、データ表のデータIDは主キーです。 カテゴリは大カテゴリ,中カテゴリ,小カテゴリの三つがあり、これらのカテゴリには固有のカテゴリIDが振り分けられています。任意のカテゴリIDを指定したときに、そのカテゴリに属するカテゴリを含め、これらのカテゴリ中に存在するデータのすべてを取り出したいと考えています。 そこで以下のようなクエリを作ったのですが、このままだと長すぎて後々問題が発生するのではないかと考えています。また、このクエリですと問い合わせに時間が掛かってしまいます。 そこでなのですが、以下のクエリを簡潔のまとめることってできないのでしょうか? select データ from データ表 where データ表.カテゴリID = 任意のカテゴリID or データ表.カテゴリID = any(select カテゴリ表.カテゴリID from カテゴリ表 where 親カテゴリ = (select カテゴリ名 from カテゴリ表 where カテゴリ表.カテゴリID = 任意のカテゴリID)) or データ表.カテゴリID = any(select カテゴリ表.カテゴリID from カテゴリ表 where 親カテゴリ = any(select カテゴリ名 from カテゴリ表 where カテゴリ表.カテゴリID = any(select カテゴリ表.カテゴリID from カテゴリ表 where 親カテゴリ = (select カテゴリ名 from カテゴリ表 where カテゴリ表.カテゴリID = 任意のカテゴリID)))); 使用しているRDBMSはMySQL5.0.26です。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
管理構造がいまひとつのような気がしますが とりあえずはjoinしていけばきれいにできそうな気もします。 仕様の説明が的を射ていないのでデータを例示してもらったほうが はやいかもしれません。
補足
このカテゴリ表とデータ表というのは、OkWaveのカテゴリ構造とその中に属する質問をデータベース化したのと同じようなもので この質問の属するカテゴリであるならば、 質問番号が2914402、カテゴリ番号が703で、データがこの質問となります。 カテゴリ表において、このMySQLのカテゴリを示すタップルは以下のようになり (703,コンピューター [技術者向け],MySQL,データベース) 中カテゴリであるデーベースならば (699,コンピューター [技術者向け],データベース,コンピューター [技術者向け]) 大カテゴリのコンピューター [技術者向け]ならば (205,コンピューター [技術者向け],コンピューター [技術者向け],コンピューター [技術者向け]) というタップルになります。