MySQL SELECT文で大量の条件を指定する効率的な方法はありますか?

このQ&Aのポイント
  • MySQLのSELECT文でWHEREを使い条件を指定する時、指定する条件が数十件~数百件合った場合、効率的な方法はありますか?
  • たとえば、住所カラムが東京都、大阪府、北海道の人だけをSELECT文で選択したい場合、一つずつ記述する必要はありませんか?PHPからMySQLを利用している場合、スマートな方法はありますか?
  • WHERE句に数十件~数百件の条件を指定する場合、ループを使用してWHERE句を動的に構築する方法が効率的です。PHPの場合、配列を使用して条件をループ処理し、implode関数を使ってWHERE句を結合します。この方法で大量の条件を効率的に指定することができます。
回答を見る
  • ベストアンサー

MySQL SELECT WHERE 条件 大量

mysqlのSELECT文でWHEREを使い条件を指定する時、指定する条件が数十件~数百件合った場合どうすればよいのでしょうか? 例えば、 以下のような感じで名前カラムと住所カラムがあったとします name  address 田中  東京都 鈴木  大阪府 佐藤  北海道 加藤  沖縄県 中村  群馬県 小林  岐阜県 高橋  東京都 渡辺  大阪府 伊藤  北海道 山本  沖縄県 斎藤  群馬県 阿部  岐阜県     ・     ・     ・ そこで、東京都と大阪府と北海道の人だけをSELECT文で選択したいのですが、 WHERE `address` = '東京都' OR `address` = '大阪府' OR `address` = '北海道' というように、一つづつ記述していかなければならないのでしょうか? この例の場合だと3件だけの指定ですが、もしもっと膨大な量を指定したいとなったとき、とても効率が悪いように思います。 なにか良い方法はないのでしょうか? ちなみにPHPからMySQLを利用しているのですが、現在 $where = array(); foreach($address as $value){ $where[] = "`address` = '${value}'"; } $where = implode(' OR ', $where); としておいて、 mysql_query("SELECT * FROM table WHERE ${where}"); とする方法しか思いつきません。 もっとスマートな方法があれば教えて下さい。よろしくお願いします。

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

質問者が選んだベストアンサー

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

数個程度ならINを使います WHERE `address` IN ('東京都','大阪府','北海道') 本当に大量なら、別途条件をテーブルに保存しておき JOINしてやればよいでしょう。

関連するQ&A

  • 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
  • 複数テーブルからselect

    sql初心者です。 複数テーブルからselectする書き方が解らず質問です。 ユーザーtable user_code | name | address ------------------------------- 1 | 山田 | 北海道 2 | 高橋 | 東京 3 | 鈴木 | 仙台 4 | 岡田 | 北海道 来店table raiten_code | user_code | raiten_date ------------------------------- 1 | 1 | 2011/05/23 2 | 3 | 2011/08/05 3 | 4 | 2011/08/05 4 | 2 | 2011/08/05 5 | 1 | 2011/10/09 6 | 1 | 2011/08/05 とテーブルがあったとして、 北海道に住むお客様 + 2011/08/05の日付指定で来店記録を拾いだしたいと思っています。 (5日に来店の北海道の方) SELECT * FROM ユーザーtable WHERE address='北海道' union SELECT * FROM 来店table WHERE visit_date ='2011/08/05'; unionにマージとあったので、多分違いそうだなと思いつつ、試してみましたが、うまくいかずにいます。 mysqlのリファレンスマニュアルなども色々見ているのですが、答えにたどり着けません。 なにかヒントのようなものでもかまいませんので、お助けいただけると助かります。

    • ベストアンサー
    • MySQL
  • PHP+MySQLの繰り返し処理で…

    PHPとMYSQLを使ってWEBページを作っています。 わからないところがあるので、どなたか教えていただけないでしょうか?php5+mysql4.0.1です。 検索フォームから送られてきた条件をもとに、1ページに10件の検索結果を表示しています。表示するのはテーブル1の名前で、ここまではうまくいっています。 例:------------------------------------------ 検索結果 神奈川県 林さん 東京都 遠藤さん 北海道 近藤さん 例:------------------------------------------ このあと、上記クエリの結果が続く限りテーブル2 から名前に該当する趣味を表示したいと思います。 例:------------------------------------------ 検索結果 神奈川県 林さん テニス 東京都 遠藤さん サッカー 北海道 近藤さん 絵画 例:------------------------------------------ この処理を加えると、一ページに10件表示されていたものが最初の一件だけしか表示されなくなってしまいます。whileの中に新たにクエリを書いているからでしょうか…? 以下に問題部分だけ見やすくまとめなおしたソースを書きました。 (1)$sql = "SELECT name,ken FROM tablename where ken=$ken"; $mysql->query($sql); while($row = $mysql->fetch()){ $name = $row[name]; (2)$sql2 = "SELECT syumi FROM tablename2 WHERE name='$name'"; $mysql->query($sql2); while($row2 = $mysql->fetch()){ $syumi = $row2[syumi]; } echo "$ken"."$name"."$syumi"; } わかりづらい説明ですみません。 テーブル1に趣味のフィールドを作ることはできない前提で、このままのDB構造でうまく上記を解決することはできますか? ご指導よろしくお願いします。

    • ベストアンサー
    • PHP
  • inやanyであいまい検索は出来ませんか?

    MySQLバージョンは5です。 住所データ (県や市のデータが入っている) -------------- 北海道室蘭 東京都千代田区 大阪府東大阪市 鹿児島県 沖縄県那覇市 とあり、鹿児島県と沖縄県の住所をリストしたい場合、 SELECT address FROM table WHERE address in('鹿児島県','沖縄県') など、in や any ではあいまい検索は出来ないのでしょうか?

    • ベストアンサー
    • MySQL
  • php5+mysqlのSELECT文でwhere句を指定すると正しく動

    php5+mysqlのSELECT文でwhere句を指定すると正しく動きません。 レコード数を取得します。 ここで、field10(category)=text型の値に基づきレコード数を取得したいのですが、 $sql="select * from A where B='C'"; とするとレコード出力(index.php)で0を出力。 where句を指定せずに $sql="select * from A"; とするとレコード出力(index.php)で97を出力。 文字コード関係のQ&Aサイトを見ましたが、phpファイルの冒頭部分に $con = mysql_connect($DBSERVER, $DBUSER, $DBPASS); mysql_query("SET NAMES 'sjis'"); $selectdb = mysql_select_db($DBNAME, $con); を指定しています。 テーブルAに含まれるデータは、csv(,区切り)で、load data infile・・・しました。 ※Records:97 Deleted:0 Skipped:0 Warnings:0 他に考えられる原因・対処方法はありますでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • MySQLで検索されたフィールド

    いつもお世話になっております。 MySQLで以下のようなSQL文を発行しています。 select * from table where (INSTR(`table`.`name`,'キーワード')<>0 OR INSTR(`table`.`keyword`,'キーワード')<>0) nameカラムとkeywordカラムのどちらのカラムから検索されたのか知りたいのですが どのようにしたらよろしいでしょうか。 (「キーワード」文字列がどちらのカラムに入っているのか知りたいです。) [環境]  MySQL:5.5.16 よろしくご教示お願いいたします。

    • ベストアンサー
    • MySQL
  • ASでつけた名前はWHERE条件にできないのですか?

    MySQL 4.0.26 人口 JINKO 面積 MENSEKI から 人口密度 JINKO/MITSUDO AS MITSUDO を計算し、これらをSELECTする際、 MISTUDOをWHERE条件に指定することはできないのでしょうか? 下記のSELECT文でエラーになってしまいます。 SELECT JINKO, MENSEKI, JINKO/MENSEKI AS MITSUDO FROM MYTABLE WHERE MISTDO > 20

    • ベストアンサー
    • MySQL
  • where文について

    2008-10-28のような形式でMYSQLに生年月日を登録しています。 フォームのセレクトボックスにて誕生月のみを取得しlike文では なくwhere文でデータの読み込みを行いたいのですがどうやれば できるのでしょうか? 通常だと "SELECT * FROM テーブル名 where カラム名 = '200-10-28' " でいけると思うのですが誕生月のみの情報で "SELECT * FROM テーブル名 where カラム名 = '10' " とやっても無理ですよね^^; $_POST['birth_month']で誕生月を取得し数字は01~12までです。 ※取得は問題なくできておりわからないのがwhere文の書き方です。 できるだけシンプルな方法で行いたいのですがお分かりになる方が おりましたら是非ご教授お願い致します!

    • ベストアンサー
    • PHP
  • PHPの変数を使ったMYSQL条件検索について

    PHP初心者です。どなたか詳しい方ご教示下さい。かれこれ半日調べてもわかりません。 フォームに入力したキーワードを使って条件検索を行い、MYSQLに登録した必要なレコードを取り出す作業を行いたいのですが「Unknown column 'henkan' in 'where clause'」と出て表示されません。 カラムの方がINT型なら表示されるのですが、TXT型なら上記エラーが出ます。 色々調べたらインジェクション対策(?)で「'」と「”」の入れ方が悪く、「`」を変数の前後に入れれば良いかと思い試してみましたが「Parse error: syntax error, unexpected~」と出てエラーが出ます。 他にも色々「'」「"」の位置を変更して見ましたがエラーが出ます。どなたか詳しい方、お教え下さい。 よろしくお願い致します。 ・PHPプログラム <?php mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('mydb'); mysql_query('SET NAMES UTF8'); $recordSet = mysql_query('SELECT * FROM manyu where syurui ='.$_POST['free']); $data = mysql_fetch_assoc($recordSet) or die(mysql_error()); echo $data['keyword']; ?> ・テーブルとカラム id syurui keyword ___ _________ __________ 6 henkan 変換 →「変換」と出てくる予定でした。

  • likeの使い方

    mySQLの4.1を使っています。 nameカラムに"水辺の蜘蛛"というデータが1件入っています。 select * from myTable where name like "%の蜘蛛%" or name_eng like "%の蜘蛛%" では1件とれるのですが、 select * from myTable where name like "%蜘蛛%" or name_eng like "%蜘蛛%" では0件になります。 何故でしょうか。

    • ベストアンサー
    • MySQL