SELECTクエリーのORの使い方とは?

このQ&Aのポイント
  • 複数テーブルから条件に合ったものを取り出す際、SELECTクエリーのORを活用することができます。
  • products_idが指定されたキーと一致し、options_idが1であるデータを取得します。
  • また、options_idが2または4のいずれかであるデータを取得するためにもORを使用します。
回答を見る
  • ベストアンサー

SELECT クエリーの OR の使い方を教えてください。

SELECT クエリーの OR の使い方を教えてください。 複数テーブルから条件に合ったものを取り出したいのですがうまくいきません。 クエリは下記のように書いています。 $query = "SELECT pa.options_values_id, pa.options_id, pov.hc_options_values_id      FROM products_attributes pa, products_options_values pov      WHERE pa.products_id = '" . $key . "'      AND pa.options_id = '1'      AND (pa.options_id = '2' OR pa.options_id = '4')      AND pov.products_options_values_id = pa.options_values_id"; 希望としては、products_id が $key のものは複数あるのでその中の・・・ options_id が '1'は必ずあるので取得 options_id が '2' か options_id が '4' のものはどちらかが、必ずあるのである方を取得 その中の products_options_values_id が options_values_id のものを最終的に取得したいのですが・・・ クエリーを2個に分けて・・・ $query = "SELECT pa.options_values_id, pa.options_id, pov.hc_options_values_id FROM products_attributes pa, products_options_values pov WHERE pa.products_id = '" . $key . "' AND pa.options_id = '1' AND pov.products_options_values_id = pa.options_values_id"; $query = "SELECT pa.options_values_id, pa.options_id, pov.hc_options_values_id FROM products_attributes pa, products_options_values pov WHERE pa.products_id = '" . $key . "' AND (pa.options_id = '2' OR pa.options_id = '4') AND pov.products_options_values_id = pa.options_values_id"; のようにすると、うまくいったのですが出来ればまとめたいのでよろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数6

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

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

pa.options_id = '1' と pa.options_id = '2' OR pa.options_id = '4' は条件が競合していますね。 単純にいえば AND ( pa.options_id = '1' OR pa.options_id = '2' OR pa.options_id = '4' ) で十分だと思います。ということは pa.options_id IN ('1','2','4') でよい?

jun_jii
質問者

お礼

できました。ありがとうございました。 pa.options_id IN ('1','2','4') という書き方もあるのですね。

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

>クエリーを2個に分けて・・・ 2個とも答えが返ってくる場合にはどうしますか? WHERE句以降をORでくくれば。 WHERE ( pa.products_id = '" . $key . "' AND pa.options_id = '1' AND pov.products_options_values_id = pa.options_values_id" ) OR ( pa.products_id = '" . $key . "' AND (pa.options_id = '2' OR pa.options_id = '4') AND pov.products_options_values_id = pa.options_values_id ) ;

jun_jii
質問者

お礼

できました。ありがとうございました。

関連するQ&A

  • MySQL SELECT結果をSET

    質問は二つあります。 (1)二つのコードをひとつにしたいのですが、どうもうまくいきません SELECT id, (price * 10) FROM table WHERE id = 1; SET @sum = @sum + (SELECT ( SELECT id, (price * 10) FROM table WHERE id = 1); (2)コードの簡略化 SELECT id, (price * 10) FROM table WHERE id = 1 OR id = 3 OR id = 8; の、WHERE id = 1 OR id = 3 OR id = 8; の部分です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 単純なクエリーなのにSELECTしてもEmpty

    | Field  | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+----------------+ | page_id | int(10) | NO | PRI | NULL | auto_increment | | site   | varchar(255) | YES | MUL | NULL | | ... ... ... このようなテーブルがあり、以下の様なSELECT文を発行してもEmptyとなってしまいます。 > SELECT `page_id` FROM `table` WHERE `site` = 'hoge'; 自分なりに色々と調べてみたところ、 > UPDATE `table` SET `site` = 'fuga' WHERE `page_id` = 1; > SELECT `page_id` FROM `table` WHERE `site` = 'fuga'; とするとちゃんと1件返ってきます。 ですが、また > UPDATE `table` SET `site` = 'hoge' WHERE `page_id` = 1; > SELECT `page_id` FROM `table` WHERE `site` = 'hoge'; とするとEmptyとなってしまいます。 どうやら、INSERTしたレコードをWHERE `site` = 'hoge'するとEmptyとなるような気がします。 何度も試したので、単純に`site` = 'hoge'の文字列自体が間違っている、などのことは無いはずです。 以下の点も合わせて、どのような原因が考えられるでしょうか。 ・レコードのINSERTは、クローラーによって行われていています。 ・他のフィールドは通常通りSELECTすることができます。 ・ストレージエンジンはmroongaです。 どなたか解決策がわかる方いらっしゃいましたら、ご回答頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • クエリの短縮化及び高速化について

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

  • 抽出が出来ないくらい遅いクエリ

    以下のようなクエリーを作成して検索を 行っているのですが、どうしても抽出が出来ないくらい 遅くどの部分で遅くしているのかが分からないため、 どなたか教えてもらえないでしょうか? ※足りない情報があればすみませんが、仰ってください。 なるべくプログラム(PHP等)を使わずクエリのみで 行いたいので、PHP云々の話しは無しでお願い致します。 最初の抽出テーブル(osi)と次の抽出テーブル(osday) をそれぞれ個別で動かすと普通の速度で抽出が旨く行きます が、それらをくっつけた形 select (省略) from osi,osday where osi.id=osday.id; とすると、抽出が行えない又は非常に遅いとなります。 ///////// 実際のクエリー文です ///////// select osday.odid,odctmid,saitemname,startday,endday from ( select odid,saitemname from order1 as o,sale as s where o.odid=s.saorderid and (o.odshipdue >= '2007-12-1 00:00:00' and o.odshipdue <= '2007-12-18 23:59:59') and (o.odcancelflag='0' or o.odcancelflag is null) and o.odclass<'4' and s.saregular='1' and s.saitemcode in (select itcode from item where itcategory='1') and odmakeday is not null ) osi , ( select odid,max(odctmid) as odctmid,to_char(min(o.odshipday), 'YYYY-MM-DD') as startday,to_char(max(o.odshipday), 'YYYY-MM-DD') as endday from order1 as o,sale as s where o.odid=s.saorderid and (o.odshipdue >= '2007-12-1 00:00:00' and o.odshipdue <= '2007-12-18 23:59:59') and (o.odcancelflag='0' or o.odcancelflag is null) and o.odclass<'4' and s.saregular='1' and s.saitemcode in (select itcode from item where itcategory='1') and odmakeday is not null group by o.odid ) osday where osi.odid=osday.odid; ///////////////////////////////////////////

  • Select文のパフォーマンスについて

    Select文のパフォーマンスについて質問です。 (1)select * from table1 where col1='00001' and kbn in (1,2,3,4) (2)select * from table1 where col1='00001' and (kbn = 1 or kbn = 2 or kbn = 3 or kbn = 4) (1)と(2)ではどちらがパフォーマンスがよいのでしょうか? SQLServer2008

  • 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
  • クエリーの作り方

    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
  • find_or_createのようなクエリを出したい

    お疲れ様です。 お世話になります。 データベースにあるキーを基にSELECTを出して、該当レコードがあればそのレコードのIDを取得、 なければ、そのキーをINSERTして、INSERT_IDを取得する。 これをひとつのクエリでできないかと悩んでいます。 perlだとfind_or_createというメソッドがあるらしいのですが、 私はPHP書きです。 DBはMySQL5を使っています。 PHPも5xです。 ググってもあまりいい案はなく、ムリならムリと突きつけていただければ 2つのクエリでがんばります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • phpからquery実行

    趣味でサーバー構築を楽しんでいます phpからqueryでデータを渡そうとしたところ詰まってしまい、どうにも分からないので質問します //MSSQLQuery// DECLARE @acct varchar(32); SET @acct = 'testname'; INSERT INTO test.dbo.tblInfoA (Number,ID,) SELECT Number,@acct FROM test.dbo.tblinfoB WHERE userId = @acct このクエリをphpフォームからDBに送りたく下記をphpに記述しました */php mssql_query("INSERT INTO test.dbo.tblInfoA (Number,ID) VALUES ('SELECT Number FROM test.dbo.tblinfoB WHERE userId = $login','$login');") エラーメッセージ message: Conversion failed when converting the varchar value 'SELECT Number FROM test.dbo.tblinfoB WHERE userId = name' to data type int. (severity 16) お分かりの方いましたらご返答よろしくお願いします。

  • 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での取得方法がわかりません。 お手数ですが教えて頂ければと思います。よろしくお願い致します。