• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLクエリで質問です)

SQLクエリで複数の検索条件を満たすレコードを取得する方法

このQ&Aのポイント
  • MySQLを使用して複数の検索条件を満たすレコードを取得する方法について質問します。自分の意図通りのクエリを作成することができず困っています。カラムが存在するテーブルから、複数の検索条件のうち3つを満たすレコードを取得したいです。
  • 具体的には、6つの条件のうち任意の3つを選択し、それらが該当するレコードを取得したいです。例えば、条件A,B,CのいずれかとD,E,Fのいずれかが該当するレコードを取得したいです。LOTO6でいう5等の結果だけが取得できるようなクエリです。
  • 解決策やアドバイスをいただけると助かります。どなたか教えていただけると幸いです。よろしくお願いいたします。

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

## MySQLの環境ないので、そちらのverで、Case when then end が使えるのか知りませんが。 where Case when col1 = '3' then 1 else 0 end + Case when col2 = '1' then 1 else 0 end + Case when col3 = '0' then 1 else 0 end + Case when col4 = '5' then 1 else 0 end + Case when col5 = '4' then 1 else 0 end + Case when col6 = '2' then 1 else 0 end = 3 で求められるでしょう。

masadondon_don
質問者

お礼

ver 5.0.77 なので恐らくCase when then end は使えると思います。 Caseは使えるというのは知っていたのですが、どういう風に使用すればいいのか分からなかったので 助かります。試してみようと思います。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

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

もしどうしても今のデータの持ち方をしたいのであれば create table hoge(id int,col1 int ,col2 int ,col3 int ,col4 int ,col5 int ,col6 int); insert into hoge values(1,3,1,0,5,4,12),(2,2,5,6,0,1,8); ここで0,1,5に合致するのであればこんな感じ select id from ( select id,col1 as col from hoge union all select id,col2 from hoge union al1 select id,col3 from hoge union all select id,col4 from hoge union all select id,col5 from hoge union all select id,col6 from hoge ) as fuga where col in (0,1,5) group by id having count(*)=3 そもそもが・・・ はっきり言えばデータの持ち方がわるい たとえばcol1とcol2は、優先順位や属性になにか違いがあるのでしょうか? colが同列のデータであればデータは横ではなく縦にもたなくてはいけません 最初からこうもっておけば create table hoge(id int,col int); insert into hoge values (1,3),(1,1),(1,0),(1,5),(1,4),(1,12), (2,2),(2,5),(2,6),(2,0),(2,1),(2,8); これだけで済みます select id from hoge where col in (0,1,5) group by id having count(*)=3 これをidごとに表示するならこんな感じ select id,group_concat(col) from hoge group by id

masadondon_don
質問者

お礼

詳しい回答ありがとうございます。 データそれぞれに属性をつけている状態ですので、 できればこの配列のまま使いたいのですが、 もう一度データ形式を見直してみます。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

たとえば6個が1,2,3,4,5,6の場合 SELECT * FROM テーブル名 WHERE CASE WHEN COL1 IN(1,2,3,4,5,6) THEN 1 ELSE 0 END+ CASE WHEN COL2 IN(1,2,3,4,5,6) THEN 1 ELSE 0 END+ CASE WHEN COL3 IN(1,2,3,4,5,6) THEN 1 ELSE 0 END+ CASE WHEN COL4 IN(1,2,3,4,5,6) THEN 1 ELSE 0 END+ CASE WHEN COL5 IN(1,2,3,4,5,6) THEN 1 ELSE 0 END+ CASE WHEN COL6 IN(1,2,3,4,5,6) THEN 1 ELSE 0 END=3 ではどうでしょうか。

masadondon_don
質問者

お礼

No.1の方と同じような構文の例ですね。 ありがとうざいます。 こちらも試してみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL 文字列操作

    SQL(Oracle)のSELECT文で、以下の様なCOL1列において、 COL1 ---------- abc_def g_hi_jk 最初の_以降を削除して、 COL1 ---------- abc g の様に表示させるにはどうすればよいのでしょうか。 「abc_def」→「abc」 は、無理矢理(?)これでできたのですが… select replace('abc_def',substr('abc_def',instr('abc_def','_'))) from dual;

  • 特定の項目が同じ値のレコードを1件だけ出力するには

    教えて下さい。全くいいSQLが思い浮かびません^^; Table:Tbl(Primary Col1, Col2) ================================================ Col1, Col2, Col3, Col4, Col5, Col6 ------------------------------------------------ No1, Row1, ABC1, 1, DEF1, 1 No1, Row2, ABC1, 1, DEF1, 2 No2, Row1, ABC1, 1, DEF1, 1 No2, Row2, ABC1, 1, DEF1, 2 ================================================ 以上のテーブル情報の時、 Col3とCol4をキーにしてレコードを抽出します。 但し、抽出するレコード内容にCol5とCol6が同一なレコードは1件もありません。 上記テーブルから取り出したいレコードは以下の通りです。 Table:Tbl(Primary Col1, Col2) ================================================ Col1, Col2, Col3, Col4, Col5, Col6 ------------------------------------------------ No1, Row1, ABC1, 1, DEF1, 1 No1, Row2, ABC1, 1, DEF1, 2 ================================================ どういうSQLで上記のような抽出が可能になるでしょうか? 宜しくお願い致します。

  • SQLクエリ

    以下のようなAccessのテーブルがあったとします。   time  -------------- (1) 200207050545 (2) 200207050546 (3) 200207050733 そこで、以下のようなクエリを実行したとします。 SELECT time from table WHERE time <= '200207050546' 当然、得られる結果は(1)(2)です。 しかし、条件を『time <= 'a'』にすると、(1)(2)(3)の結果が得られてしまいます。 条件が『time <= 'a'』のときはレコードなしにしたいのですが、 どうすればよいでしょうか?

  • 複数行のクエリを、まとめて実行するには?mysqli_multi_query()?

    PHPとMySQLの環境です。 複数行のクエリを、まとめて送って取得したいと考えています。 ですが、今試行錯誤しているのですが、うまく行かない状態で、クエリをきちんと実行できません。 処理の流れとしては、 [DBにアクセス]→[2つのクエリの実行]→[データ取得]→[DBをクローズ] でいいのではないかと思ってやっているのですが、 2つのクエリを実行するのはなにやら無理なような記述もウェブ上で拝見しました。 その場合、同じDBの同じテーブル内の異なるデータを取得したいだけなのに、 わざわざ、一度DBにコネクトして、切断、そしてまたコネクトして、切断ということを繰り返さないとダメなのでしょうか。。? そもそも同一PHPファイル内で二度も接続、切断はすべきではないですか? ちなみに、 一つ目のクエリでは、テーブル(table_a)のレコード数をカウントしてPHP側で取得するという流れの処理です。 $query = "SELECT count(*) FROM `table_a`"; もう一つのクエリは、テーブル(table_a)の最新のレコードの、idカラムのidを取得するだけのものです。 $query = "SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1"; この処理を一度のクエリで入れ込むことは可能でしょうか。 それぞれ単独では実行できます。 PHPでこのような関数 mysqli_multi_query() を見つけて色々調べているのですが、 いまだに使用方法がきちんとつかめない状況です。 これで複数のクエリを送ることは可能でしょうか。 アドバイス宜しくお願いします。

    • ベストアンサー
    • MySQL
  • find_or_createのようなクエリを出したい

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

    • ベストアンサー
    • MySQL
  • Oracle SQLで文字列操作

    始めまして。 VB6でプログラミングをしています。DBはOracle8.16です。 Oracleテーブル上で、カテゴリー別に " 文字列 & ナンバリング " の値をもつレコードを、インサートしていく作業をしています。 ナンバリングの部分の現在の最大値に1足したものを、 新規レコードで値を持たせインサートしてます。 tblA Col1           Col2 1            NA-P1-1 1            NA-P1-2 1            NA-P1-3 1            NA-P1-4 3            NA-P3-1 3            NA-P3-2 3            NA-P3-3 1   この場合、 Select max(Col2) from tblA where Col1 = 1 で現在のCol1=1のMax値(Col2)は NA-P1-4 と取り出せるできるんですが、新規に追加するレコードのCol2の値が NA-P1-5だと取得できる方法はあるでしょうか。 Select Max(col2)+1 ~だと、カラム定義がvarchar2なんで、 当然のようにシステムに怒られました(当然ですが。。) お分かりの方、お願い致します。

  • クエリについて

    drop table if exists テーブル名; というふうにテーブルが存在していたら削除でありますが テーブルが存在していたら、 あるテーブルのあるカラムの値が1であるレコードを削除する というクエリをどのように書いたらいいか教えてください。 mysqlのバージョンはversion: 4.0.22です。

    • ベストアンサー
    • MySQL
  • カウントして抽出するsqlをまとめたい

    mysql初心者です。宜しくお願い致します。 PHP+Mysqlで以下のスクリプトを組んでいます。 変数aを一旦決めておき、カウント結果次第で変数aの値を広げるというものです。 これをSQL文一発にまとめたいのですが、可能でしょうか? mysqlのバージョンは5.1.34です。お詳しい方、ご教授お願い致します。 $a = 10; //仮に10 $query = "SELECT COUNT(*) AS cnt FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query); $row = mysql_fetch_array($result); if($row[cnt] < 10){$a = 20;} //件数が10件以下ならaの範囲を広げて結果取得 $query = "SELECT * FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query);

    • ベストアンサー
    • MySQL
  • sqlplusのspoolで空白行出現

    OS:Windows Server 2003 DB:Oracle10g(10.2.0) sqlplusでselect結果をcsvファイルにspoolする際に空白行が出力されて困っています。 以下のsqlを実行した場合、 ----- SET ECHO OFF SET FEEDBACK OFF SET HEADING OFF SET PAGESIZE 0 SET LINESIZE 2000 SET TERMOUT OFF SET TRIMSPOOL ON spool test.csv select '"'||col1||'","'||col2||'","'||col3||'"' from table; spool off ----- 改行を含むカラムを含む行の後に空白行が出力されます。 (2レコード目のcol3は"g"と"h"の間に改行コードがあるデータが格納されているが、何故か2レコード目と3レコード目の間に空白行が出力される) ----- "abc","def","ghi" "abc","def","g hi" "abc","def","ghi" ----- これはsqlplusの仕様でしょうか。 2行目と3行目の間の空白行を削除してspoolする方法はありますでしょうか。 なお、改行を含むカラムの改行を改行以外の文字に置換して出力した場合は、以下のように空白行が出現しません。 ----- "abc","def","ghi" "abc","def","gカイギョウhi" "abc","def","ghi" -----

  • ACCESS2000でクエリを抽出条件で抽出

    VBA上でクエリの抽出データを取得してファイルに書き込むというプログラムを書いております。 抽出条件として、今日の日付のレコードを取得したいのですが型が一致しませんとエラーになります。 strSQL = "SELECT * FROM " & (クエリー名)& " where (クエリー.カラム名)='" & Format(Date, "yyyy/mm/dd") & "'" クエリーのカラム名は全角漢字です。 どこがおかしいのでしょうか? よろしくお願いいたします。