• 締切済み

クエリの短縮化及び高速化について

カテゴリ表(カテゴリ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です。

  • MySQL
  • 回答数1
  • ありがとう数0

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

管理構造がいまひとつのような気がしますが とりあえずはjoinしていけばきれいにできそうな気もします。 仕様の説明が的を射ていないのでデータを例示してもらったほうが はやいかもしれません。

yuiti_msd
質問者

補足

このカテゴリ表とデータ表というのは、OkWaveのカテゴリ構造とその中に属する質問をデータベース化したのと同じようなもので この質問の属するカテゴリであるならば、 質問番号が2914402、カテゴリ番号が703で、データがこの質問となります。 カテゴリ表において、このMySQLのカテゴリを示すタップルは以下のようになり (703,コンピューター [技術者向け],MySQL,データベース) 中カテゴリであるデーベースならば (699,コンピューター [技術者向け],データベース,コンピューター [技術者向け]) 大カテゴリのコンピューター [技術者向け]ならば (205,コンピューター [技術者向け],コンピューター [技術者向け],コンピューター [技術者向け]) というタップルになります。

関連するQ&A

  • クエリーの作り方

    SQLから、Postgres上のデータを参照しています。 まず、この形式で取り出そうとしています。 $query = 'select * from comment where oya = ■■'; この、■■のところには整数が入りますが、 事前にアレイに入れてある数字「 $DB_data[0] 」から、 whileでぐるぐる回して検索したいのですが、 こうすると、エラーになります。 $query = 'select * from comment where oya = $DB_data[0]'; エラー Query failed: ERROR: syntax error at or near "$" at character 何か良い手はないでしょうか? 別のテーブルの数値を持ってきて、$を使わずに検索できれば・・ こういうのも可能でしょうか・・?

    • ベストアンサー
    • PHP
  • CakePHPでquery()を使うときについて

    CakePHP バージョン1.3.7です。 CakePHPでqueryを使ってSQL文を書くときなんですが 公式サイトに以下のように App::import('Sanitize'); $sql = "SELECT * FROM users WHERE id = $id"; $sql = Sanitize::clean($sql); サニタイズをしなさいとありますが、 上記の$idの部分がdate型で $sql = "SELECT * FROM users WHERE date = '2011-05-16'"; みたいなときシングルクオートがエスケープされてクエリが通らないのはどうやって解決すればいいんでしょうか?

    • ベストアンサー
    • PHP
  • PHP+MySQLで高速化

    mysql_query()が返したresourceの行数は得られませんか? 例をあげると データが id p (フィールド) 42 651 23 357 67 123 28 385 このように4レコード有ったとして $res = mysql_query('select p from tbl where p="123"'); これで、$resから3行目というのを得て、3を使ってidの67を得たいのですが、 $res = mysql_query('select id,p from tbl where p="123"'); のようにして$resのidを見るようにする以外の方法は無理なんでしょうか? もし前者が可能ならそちらの方が速いと思うのですが。

    • ベストアンサー
    • PHP
  • ACCESSクエリーで特定の項目を更新したい

    ACCESSでテーブルから抽出したクエリーの特定の列だけに 1という数字をふりたいのですが、 update 抽出元のテーブル set 任意のセル = 1 where クエリー名 更新クエリーで上記SQLを設定しても、クエリー実行時に、 バラメータを要求され、 全てのテーブル列に1がふられます。 式が違うのでしょうか。 デザインビューにしてSQLビューに切るかえる。 select 列 from 抽出元のテーブル where 抽出の条件 ; みたいなデータです。 where の前を書き換えます。 select 列 from 抽出元のテーブル の部分を update 抽出元のテーブル set 任意のセル = 1 としてください。 最終的には以下のイメージ update 抽出元のテーブル set 任意のセル = 1 where 抽出の条件 ;

  • アクセルでのクエリ

    アクセスで以下のようなクエリを作ったのですが、 もっと簡略化できないでしょうか? SELECT * FROM testTable WHERE colA like "*あ*" OR colA like "*い*" OR colB like "*あ*" OR colB like "*い*" OR colC like "*あ*" OR colC like "*い*" ;

  • ACCESS更新クエリー活用方法について

    ACCESSでテーブルから抽出したクエリーで表示された特定の列だけに 1という数字をふりたいのですが、 update 抽出元のテーブル set 任意のセル = 1 where クエリー名 上記方法、更新クエリーで上記SQLを設定しても、クエリー実行時に、 バラメータを要求され、結果 全てのテーブル列に1がふられます。 式が違うのでしょうか。あくまでもクエリーで抽出されたものだけに 1をふりたいのですが。 デザインビューにしてSQLビューに切るかえる。 select 列 from 抽出元のテーブル where 抽出の条件 ; みたいなデータです。 where の前を書き換えます。 select 列 from 抽出元のテーブル の部分を update 抽出元のテーブル set 任意のセル = 1 としてください。 最終的には以下のイメージ update 抽出元のテーブル set 任意のセル = 1 where 抽出の条件 ;

  • SQLite3(PDO)でクエリー件数を取得したい

    SQLite3をPHPで使用しています。 ネットでいろいろ見たのですがわかりませんでしたのでこちらで質問させて頂きました。 SELECTで条件に合うidを抽出した場合にその行数を取得したいのですが、どのようにするとスマートに取得できるのでしょうか? スマートにというのは「データベースへのアクセスが一度で済むような」という意味です。抽出データの取得と件数の取得が一度のアクセスで可能なのでしょうか? $pdo = new PDO(sqlite:test.db); $query = $pdo->prepare('SELECT id FROM testTable WHERE id > 0 AND id < 10'); $query->execute(); 私が現在行なっているのは、データ抽出は上記のコードでやって、件数の取得は以下のようにしています。 $query = $pdo->prepare('SELECT count(*) FROM testTable WHERE id > 0 AND id < 10'); $query->execute(); $num = $query->fetch(PDO::FETCH_NUM); echo $num[0]; ネットで調べてもMySQLやPostgreSQLのことしか載っていなく、なかなかSQLite3での取得方法がわかりません。 お手数ですが教えて頂ければと思います。よろしくお願い致します。

  • SQLクエリ1年前のデータを削除できない

    現在このクエリを作成したのですがデータが削除されなくて、データ全件が抽出されてしまいます。 以下の構文で試したのですが・・・・もし、ご指摘、アドバイス等ございましたらよろしくお願いします。 select * from テーブル名 delete from テーブル名 where 日付 < = (select DATEADD(year,(-1),(日付))) ちなみに、日付はDATETIMEです   バージョン:SQL management studio 10.50.25.000

  • ACCESSの更新クエリー活用方法の件(続き)

    ID 商品 価格 備考  フラグ という列をもつテーブルがあるとします。 こちらは、 テーブル名:商品名 としています。 これにたいして選択クエリーを使って、特定の商品だけを クエリーで引っ張ってきています。 クエリー名:抽出 このクエリー名:抽出で引っ張ってきたデータにあるフラグの列に「更新クエリー」で 1の数値を入れたいのですが、 それは更新クエリーでどのようにSQLをせっていするかたちになりますか。 更新クエリー名:更新 update 抽出元のテーブル set 任意のセル = 1 where 抽出の条件 update 商品名 set フラグ = 1 where 抽出 ; 上記方法、更新クエリーで上記SQLを設定しても、クエリー実行時に、 バラメータを要求され、結果 全てのテーブル列に1がふられます。 式が違うのでしょうか。あくまでもクエリーで抽出されたものだけに 1をふりたいのですが。 http://okwave.jp/qa/q7278856.html > http://okwave.jp/qa/q7277790.html の#1・#2です。 #1に「選択クエリは作れますか?」と書いたのをほったらかしにして、続きの質問とは・・・。 具体的なテーブル名・列名を提示してないので、イメージで書いてあるんだから 回答を丸写ししちゃダメでしょ。 > #1です。ごめんなさい。もっとシンプルに考えれば良いです。 デザインビューにしてSQLビューに切るかえる。 select 列 from 抽出元のテーブル where 抽出の条件 ; みたいなデータです。 where の前を書き換えます。 select 列 from 抽出元のテーブル の部分を update 抽出元のテーブル set 任意のセル = 1 としてください。

  • queryの使い方

    お世話になります。 queryの使い方で質問です。 DB内に下記の様なデータが在ります。 -------------------------------- | id | header | footer | -------------------------------- | 1 | HTML文 | HTML文 | -------------------------------- テーブルとフィールドを指定してデータ(HTML文)を抜き出したいのですが、いまいち方法が理解できません。 queryの使い方を理解していないのだと思います。 以下、PHPに記述しているコードです。PHP自体は問題なく動いてます。 PHP---------------------------------------------------- $footer =& $mdb2 -> query('select footer from where id=1'); if (PEAR::isError($footer)) {die($footer->getMessage());} $smarty->assign("footer",mb_convert_encoding($footer,"SJIS","UTF-8")); 表示---------------------------------------------------- MDB2 Error: syntax error 宜しくお願いします。