• 締切済み

WHEREなどの条件が多い場合、どうすべきか?

複数のテーブルをleft joinで繋いで、カラムをエクセルのようなシートとしてWebで表示しています。 各カラムは、VERCHAR、DECIMAL、INT(SMALLINT~MIDIUMINT)の型を持っています。 エクセルのシートのような感じなので、エクセルのオートフィルタのような機能を付けたいと考えています。 各カラムをAND条件で指定できるやつです。 ですが、そもそもカラムの数が30ほどあります。 このような場合でもANDやBETWEENを使ってひたすらWHERE条件やCASEなどで抽出するようにするのでしょうか? DECIMALやINTの場合は条件を○○(最低値)~○○(最高値)のようにします。 VARCHARの場合は、選べる文字列が複数(数十程度)あり、そこから選べるようにします。 例えば、東京駅。渋谷駅、新宿駅、品川駅、横浜駅・・・などがあって、フィルターしたい文字列だけ選びます。 たぶんINを使った感じになります。 聞きたいのは、WHERE ○○ AND ○○ AND ○○ AND ・・・のようにひたすら条件を作っていくしかないのでしょうか? どうぞよろしくお願い致します。

  • MySQL
  • 回答数3
  • ありがとう数9

みんなの回答

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

書式としては col1 = 'A' AND col2 = 'B' AND col3 = 'C' なら WHERE (col1,col2,col3) IN (('A','B','C')) ORならセットで複数指定して WHERE  (col1,col2,col3) IN (  ('A','A','A'),  ('B','B','B'),  ('A','B','C') ) という書き方もあるにはあります。パフォーマンスはEXPLAINしてみて。 ご参考まで

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

>ひたすらWHERE条件や~ そうすべきです。 WHERE句が最も速く抽出条件を絞ります。 HAVINGやJOINでも絞れますが、処理した結果に ついて条件をかけるので、遅くなります。 それと、30くらいの条件などは通常業務ではよく 出てくる範囲です。尚、サブクエリが使えるDBなら、 サブクエリを入れ子にすると、ANDで条件を結合 するより効率があがります。 (1)SELECT * FROM XX WHERE a=1 AND b=2 (2)SELECT * FROM (SELECT * FROM XX WHERE a=1)  WHERE b=2 後者の方が効率が良いということです。特に内側のクエリが インデックスによる条件抽出なら、外側のクエリが対象とする レコード群はかなり数が絞り込まれている状態からスタート できる訳です。 尚、抽出したレコードを更新する場合、JOINしているクエリが 対象だと制約があります。1:1になるか、1:NのN側が保証され ないと更新できません。保証できない時は対象テーブルと同じ レイアウトの一時テーブルに抽出レコードを記録し、これと 主キーを使ってINNER JOINします。同じキー構成なので必ず 1:1になります。一時テーブルはセッション単位に独立している ため、他のスレッドと干渉しません。また、セッションが切れる 時に自動的に解放されるます。従って、トランザクション管理が ないので高速ですし、後始末も不要です。

fantrax
質問者

お礼

ありがとうございます! >そうすべきです。 >WHERE句が最も速く抽出条件を絞ります。 >HAVINGやJOINでも絞れますが、処理した結果に >ついて条件をかけるので、遅くなります。 そうなのですね・・・!ひたすらWHEREって効率が悪いのかと勘違いしていました。 >尚、サブクエリが使えるDBなら、 >サブクエリを入れ子にすると、ANDで条件を結合 >するより効率があがります。 これは知りませんでした。 >尚、抽出したレコードを更新する場合、JOINしているクエリが 対象だと制約があります。・・・ ありがとうございます。ここはどうやるのか不明だったのでたいへん参考になりました。

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

質問の意図がよくわからないのですが・・・ where 条件1 and 条件2 and 条件3 という場合、条件1、2、3のそれぞれに相関関係がないなら 並行して条件を設定して絞り込むしかありません 条件同士なんらかの関係がある場合は、場合によっては 効率的なSQL文がかけるかもしれません また正規化などきちんとされていれば joinする際にinner joinで絞り込みができる場合もあります いま与えられている命題ではその程度しか回答しようがありません

fantrax
質問者

お礼

アドバイス頂きましてありがとうございます。 すみません、質問の意図は「30ものカラムの条件をANDで並列に書くことが効率的な方法なのでしょうか?」というものです。 あと質問に書き忘れましたが、このような検索(フィルタリング)をする場合、全てのカラムにインデックスを張る必要がありますか? このフィルタリングをして抽出したレコードを更新する必要があります。 もしWHEREなどで条件に設定するカラムにインデックスがないと、UPDATE時にテーブル・ロックがかかるのですよね? 一度に数十万行を更新するのでできれば行ロックでUPDATEを済ませたいと思っています。 ちなみにInnoDBです。 >また正規化などきちんとされていれば >joinする際にinner joinで絞り込みができる場合もあります ありがとうございます。少し見直す必要もありますが、だいたい正規化できています。

関連するQ&A

  • 文字型のwhere条件

    Oracleの初心者です、以下のSQL文は、助けてください。 Select * from RTM02AISM where TM02001 >= ' ' and TM02001 <= '゜゜゜゜゜゜゜゜゜゜゜' order by TM02001; TM02001はテーブルの中で11桁の文字型(CHAR)です。 文字型のwhere条件は、' 'と'゜゜゜゜゜゜゜゜゜゜゜' 組み合わせで、全てのTM02001列を表示できますか。 宜しくお願いします。

  • Oracle SQLの、where句内の条件文について教えてください。

    Oracle SQLの、where句内の条件文について教えてください。 下記SQLの(1)と(2)の記述文を教えてください。 (1)例:owner = sys,admin ownerがsysまたは、adminを抽出 (2)例:column_name = '*aaa*' column_nameに「aaa」が含まれているデータ SELECT owner, table_name,column_name FROM all_tab_columns WHERE (1)(Ownerを複数指定)   and (2)(column_nameに、●●が含まれるデータ)

  • WHERE句の条件を区別する

    こんばんは 業務で以下の切り分けをしたいのですが、可能でしょうか。 SOAP通信を使っていて、パフォーマンス的な観点から、select文は使用したくないと思っています。 ■環境 ・PHP5 ・MySQL ・FreeBSD6 ■やりたいこと Update文で更新を行ったときに、データそのものがなくて更新できなかったのか、データは存在するがPK以外の条件がマッチしなくて更新できなかったのかで、エラーコードを分けたい 例えば、  update tableA set column1='aaa' where pk1=1 and pk2=2 and column2='bbb'; といったSQL文で、「pk1=1 and pk2=2」に合致するデータがないのか、データは存在するが「column2='bbb'」には合致しなくて更新されないのかの切り分けをしたいのです。 かなり、困ってしまっています。 SQL文でできない場合でも、何かしらの解決方法がありましたら、よろしくお願いいたします!!!

  • MySQLでWHERE条件が効かない

    環境: PHP 5.0.3 MySQL 4.0.14b(Win)(←古いこと承知) IIS 5.1 『いますぐ導入!PHP+MySQLで作る最速Webシステム』という入門本のサンプル プログラムを使って勉強していますが、SQLのWHERE文が効かず全レコードが 出てきてしまいます(同書は PHP 4.3.1 を前提に書かれます) 単純に、書籍のISBN、タイトル、価格などが収められたサンプルデータベースで、 こういう↓ search_form.htm から sample.php にPOSTしてます。 書籍タイトル<INPUT size="44" type="text" name="title" maxlength="100"> を含む sample.php は、上記などに入力された検索文字列でWHERE条件で絞込みます。 一部抜粋しますと: | //SQL文を組み立てます(フォームの値をWhereに指定) | $sql = "select * from bookinfo | where (isbn like '$isbn%') and | (title like '%$title%')"; | //priceは指定されているときだけSQL文に追加 | if (strlen($price) > 0) { | $sql .= " and (price <= $price)"; | } | $sql .= " order by isbn"; | | //SQL文の確認用(デバッグ時のみ使用します) | print $sql; どの検索条件を入力しても全レコードが出力してしまうので、上記抜粋の 最後の行のコメントを有効にしたところ、こういうSQL文を吐き出しており、 入力した文字列が有効になっていません。 select * from bookinfo where (isbn like '%') and (title like '%%') order by isbn 対応方法につき、ちょっと見当がつかないのですが、何かお心当たりが ありましたらご教示いただけますと幸いです。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • エクセルで3つの条件で検索したい場合

    エクセルで3つの条件で検索したい場合、どうすればいいですか? オートフィルター オプション 抽出条件の指定 「  」を含む 「  」を含む で、3つ目の条件を入れる項目がありません。 例えばシートに 列 A B C D E F とあり、 「A」を含む 「B」を含む 「C」を含む という三つの条件で抽出したい場合、どのようにオートフィルター オプションを使えばいいのでしょうか? ▼マークのフィルターをクリックして 外したい項目のチェックボックスを外せば、A,B,Cを抽出できることはわかってますが 今回は例なだけで、実際はもっと複雑なデータなので、 「オートフィルター オプション」「抽出条件の指定」のやり方が知りたいです。

  • SQLのWHERE句を条件によって追加したい

    SQLのWHERE句にパラメータで渡された値がnullでない場合は条件に 含めるようにしたいのですが、書き方が分かりません。 CASEを使って書いてもエラーになってしまいます。 SELECT 項目1 ,項目2 FROM テーブル WHERE 条件1 = パラメータ1 AND 条件2 = パラメータ2 -- パラメータ3がnullでない場合は下記条件を付けたい AND 条件3 = パラメータ3 使っているのはpostgresqlです。 よろしくお願いします。

  • Excelの関数で、検索条件(複数)を満たす場合値を返す方法について質

    Excelの関数で、検索条件(複数)を満たす場合値を返す方法について質問です。 セルA2にある文字列が、別ファイルのA列にある文字列を含む場合セルB2に○を、含まない場合は×を入力する関数を教えて下さい!! --------- book1.xls シート1 A2にある文字列が、 book2.xls シート1 A列にある文字列のいずれかを含む場合、 book1.xls シート1 B2に「○」を、含まない場合は「×」を結果として反映させたいです。 ※book1.xlsのリストは全角カナ、book2.xlsのリストは半角カナ です。 ※book2.xls シート1にある検索条件は行列共に増える可能性があります。 マクロやVBAではなく関数で行うことは可能でしょうか? 勉強不足ですみません。 色々調べて試しているのですが、なかなかうまくいかないのでお力をお貸し下さい。 よろしくお願いします。

  • エクセル 複数条件抽出について

    エクセル2013を使用しています。 データシートより複数条件に当てはまるデータを 別のシートへ必要な項目のみ抽出する方法(関数orマクロ)をお教え下さい。 データシート:A列からU列まで様々なデータが入力されている。 抽出条件:H列とN列 抽出する項目:C列・I列・M列・O列・Q列・R列・S列 (抽出する項目は増える可能性有) 複数条件の抽出はフィルタオプションで出来たのですが、 抽出が必要な項目を指定する方法が分かりませんでした。 宜しくお願いします。

  • エクセル 複数条件でのLOOKUP

    エクセルで、特定のキーで別表を参照してそこから値を表示するにはVLOOKUPを使用すると思いますが、複数条件でLOOKUPする事は可能でしょうか。 例えば、 シート1のA列とD列 シート2のB列とF列  2つの条件に合う(シート1A列=シート2B列 and シート1D列=シート2F列)レコードをシート2のG列からシート1のE列に表示したいと言う場合です。  シート1   A B C D E           1 01 ** ** 01       2 01 ** ** 02 うう       3 05 ** ** 01 ああ          ↑  シート2   A B C D E F G          1 ** 08 ** ** ** 01 いい       2 ** 01 ** ** ** 02 うう       3 ** 05 ** ** ** 01 ああ 判りにくい説明で申し訳ありませんが、よろしくお願いいたします。

  • EXCEL 2列交わる条件でフィルタをかけたい!

    初心者ですいません。 A列に対してB列の値を、複数条件でフィルタをかける方法を教えてください。 例えば…下記のように、 B列の(値→⚪︎を含まない値→×)だけに絞った A列の値を、別のシートに抽出したいと思っています。 ======================== 【フィルタ前】 A列 B列 ーーーーーーー 1 × 1 × 1 ⚪︎ ーーーーーーー 2 × ーーーーーーー 3 ⚪︎ 3 × ーーーーーーー 4 ⚪︎ ーーーーーーー 5 × 5 × 5 × 【フィルタ結果】 A列 B列 ーーーーーーー 2 × ーーーーーーー 5 × ======================== 1シートに対しデータが1000行位で、 5シートあるので、困っています。 どんな方法でも良いので、宜しくお願いします。