• 締切済み

MySQL 複合検索条件

MySQLでひとつのテーブルの複数フィールドに値を設定してレコードを参照したい。 例えば、key-field-1 >= ??? と key-field-2 >= ???で key-field-1は主キーでkey-field-2は従属キーとし、key-field-1の条件に合うレコードで、次にkey-field-2の条件に合うレコードを見つけ、それ以降の全てのレコードを抽出したい。 select * from table-1 where key-field-1 >= ??? and key-field-2 >= ??? で検索すると 両方の条件を満たすレコードのみ検索される。 アドバイスを待っています。

みんなの回答

回答No.6

質問があいまいでは。 データの具体例を。

  • tom233
  • ベストアンサー率17% (61/352)
回答No.5

>それはkey-field-1が同一の値で これおかしくないか? 主キーが重複?

  • tom233
  • ベストアンサー率17% (61/352)
回答No.4

Selcet * From table-1 Where key-field-1 >= ( Select key-field-1 From table-1 Where key-field-1 >=??? And key-field-2 >=??? Order by key-field-1 ASC Limit 0 , 1 ) 一応書くとこんな感じかな。サブクエリを利用する方法で起点となるkey-field-1を取得してそれ以降のデータをすべて取得するなら こんな感じですかね。 もっとスマートな方法も有るかも知れないけどとりあえず思いついたのが上記の方法。

jaxonnoby
質問者

補足

貴重なアドバイスありがとうございます。 早速テストしてみましたが、問題がひとつ残りました。それはkey-field-1が同一の値でkey-field-2の値が異なるレコードが複数存在する場合でも、key-field-1を起点としたレコードの抽出となり、key-field-2以降という条件が無視されてしまいました。

回答No.3

>複数フィールドの値で、ある起点を見つけそれ以降のレコードを全て抽出したいのですが where (key-field-1 = ??? and key-field-2 >= ???) or key-field-1 > ??? ということ?

  • tom233
  • ベストアンサー率17% (61/352)
回答No.2

だったら開始となる主キーを取得してそれ以降を拾うようにすればいい。

  • tom233
  • ベストアンサー率17% (61/352)
回答No.1

質問は何? >両方の条件を満たすレコードのみ検索される。 当たり前だけどなにが問題?

jaxonnoby
質問者

補足

複数フィールドの値で、ある起点を見つけそれ以降のレコードを全て抽出したいのですが、表記の命令では要求が満たされません。だから、その他に何か方法があるのかのアドバイスがあればと思って投稿したのです。

関連するQ&A

  • MySQL WHERE句のLIKE検索

    初心者ですみません。 MySQL WHERE句のLIKE検索で、引っかかった文字列を 除いた項目を表示させるにはどうしたらいいでしょうか。 例えば、 SELECT * from [テーブル名] where [フィールド名] like '%あ%'; として、「あ」が入っているレコードを検索し、 該当しないレコードを表示させる。 どうか教えてください。よろしくお願いします。

  • MySQLで日本語検索

    MySQL初心者のものです。 今PHPとMySQLを利用して検索システムを作っています。 しかし日本語検索がどうしてもうまくいきません。 一応「教えてgoo」でも探してみたのですが、解決しませんでした。 MySQLで、 テーブル名 table フィールド名 field とすると、 select * from table where field like '%キーワード%'; のように検索してみたのですが、思うような結果が返ってきません。 ネットで検索すると「senna」をインストールと書かれていましたが、 そういったものをインストールしなければMySQLで日本語検索は出来ないものなのでしょうか? ちなみに MySQL5.0 PHP5.2.1 を利用しています。

  • 2つフィールドを連結して検索するには

    MySQLの初心者です。よろしくお願いします。 1つのテーブルにある2つのフィールドのうち、どちらかにキーワードが入っている場合(両方に入っている場合も含む)を抽出したいのですが、検索するキーワードが1個の場合は、下記のようにすれば、うまく動くのですが、 ●1個のキーワードで検索する場合 (例として、2つのフィールドのうちどちらかに「山」のキーワードが入っている場合を抽出) select * from table WHERE (item_name LIKE "%山%" or outline LIKE "%山%" ) ●テーブルの内容(テーブル名:table) item_name | outline ==========+========= 山がある + 山と川 ----------+---------- 山がある + 川と森 ----------+--------- 山がある + 谷と林 --------------------- 質問したいことは、上記のテーブルから、item_nameとoutlineのフィールドのうち、2つのキーワード「山」と「川」が両方含まれるレコードを抽出したいです。上記のテーブルでいうと、抽出の結果、1行目と2行目が抽出したいのです。 ちなみに、下記のように記述したら、上記のテーブルで1行目だけ抽出されます。 select * from table WHERE (item_name LIKE "%山%" and item_name LIKE "%川%" or outline LIKE "%山%" and outline LIKE "%川%" ) 他にも、下記のように試してみたのですが、うまく抽出できませんでした。 SELECT * FROM table WHERE (concat(item_name,outline) LIKE '%山%' and concat(item_name,outline) LIKE '%川%') item_nameとoutlineのフィールドを結合して、結合した文字列で、「山」と「川」の両方が入っているレコードを抽出する方法はありますか? 2つのフィールドの文字列をあわせたなかから、「山」と「川」のキーワードが両方含まれるレコードを抽出したいのですが、何かよい方法はありますでしょうか。ご回答よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • PHP+MYSQLでワード検索

    PHP+MYSQLでワード検索を作りたいです。 検索は二つのテーブルの中のいくつかのフィールドに対して行います。 例えばキーで結ばれたテーブルA、Bがあったとして、 テーブルAのフィールド1、フィールド2、フィールド3、 テーブルBのフィールド3、フィールド4、フィールド5のいずれかに [佐藤]という文字列が含まれているデータを取り出す という事をしたいのです。 select * from テーブルA A, テーブルB B where A.フィールド1 = '%佐藤%' or A.フィールド1 like '%佐藤%' or A.フィールド2 like '%佐藤%' or ... という書き方だと、検索対象フィールドやレコードが多いと速度が遅くなりそうな気がします。 フルテキストインデックスを使用して検索を作成しようと思ったら、日本語は対応していないという事でした。 何か良い方法はありませんか? アドバイスをお願いします。 また、上のテーブルA、Bのレコードデータが貼り付けられたHTMLファイルがあります(1レコードで1ファイル)。 HTMLファイルを変数に読み込み、文字列が含まれているかをチェックする方法を思いついたのですが、これは重くなりますか? 検索対象レコードは現在150程度ですが、将来的には数千~数万になると予想されます。

    • ベストアンサー
    • PHP
  • 除外抽出条件

    こんにちは、SQLの抽出条件でわからないところが在るのでよろしくお願いします。 テキスト型でメールアドレスの入ったフィールドに対して抽出をしたいのですが、"@" の含まれていないフィールドの抽出の仕方がわかりません。含まれる場合は select * from テーブル where メールアドレス like '%@%' で出来ます。含まれない場合、 select * from テーブル where メールアドレス <> の後にどう記述すれば言いのでしょうか?

  • mysql_num_rowを繰り返したい

    ラジオボタン選択肢アンケートのデータをMySQLのテーブルに入れて、 mysql_num_row()で各選択肢の件数を抽出したいのですが。 選択肢は1~5の数値(int型)でanテーブルに入っています。 for ($i = 1; $ <= 5; $++) { $rst = mysql_query("SELECT * FROM an WHERE field=$i", $con); $kotae.$i = mysql_num_row($rst); } このように書くと 1の選択肢の数しか返してきません。しかも、件数が間違って返ってくる。  文法が間違っているからだと思うのですが。上記のようなことをやりたいのです。  forを使わないでやると、 $rst = mysql_query("SELECT * FROM an WHERE field=1",$con); $kotae1 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=2",$con); $kotae2 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=3",$con); $kotae3 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=4",$con); $kotae4 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=5",$con); $kotae5 = mysql_num_rows($rst); です。  forを使って楽にやりたい場合はどうすればよいでしょうか 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • AccessのクエリでvbLfのみ抽出するには

    Access2010のクエリー(SQL)で vbLfかvbCrLfが含まれているレコードを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(10) & "*"; vbLfが含まれているレコードは抽出せず、 vbCrLfが含まれているレコードだけを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(13) & Chr(10) & "*"; でよいと思いますが、 vbCrLfが含まれているレコードは抽出せず、 vbLfが含まれているレコードだけを抽出するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。

  • jspでMysql検索で困っています。

    jspでMysql検索で困っています、 コマンド画面で下記の入力をすると条件の検索が出来ます。 select * from kanagawa where fish like '%コイ%'; (8件中検索されるのは1件でそれが表示されます) jspで命令すると、違う結果が返されてきます。 String sql; sql="select * from kanagawa where fish like '%コイ%'"; ResultSet rs=db.executeQuery(sql); 最初は変数でテーブル名等受け取っていたのですがうまくいかなかったので直接検索文を入れたのですが結果は同じく違う物が検索されてしまいます。(fishのフィールド8件中5件が結果としてでます。) 何を調べても間違いなさそうですが・・ どうにもならず困っています、助けてください、お願いします。

  • mysqlで横方向ではなく縦方向の条件抽出は…

    id   hoge   num 01   AAA   0 01   BBB   1 02   AAA   1 03   BBB   0 というテーブルがあったとします。 select id from table where hoge='AAA' and num=0 のような条件で検索するのは普通ですが、 カラムではなくレコード単位で見て hogeの値がAAAとBBBの両方である場合のデータとして「01」というidのみを抽出する方法はないものでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 紐付いている3つのテーブルに対しての検索条件の指定がうまくいきません・・。

    紐付いている3つのテーブルに対しての検索条件の指定がうまく書けません。 3つのテーブルが紐付いています。 ・main_tableのIDと、note_id_tableのID ・note_id_tableのnote_IDと、note_value_tableのnote_ID main_table ID, name ----------- 1, aaa 2, bbb 3, ccc 4, ddd 5, eee note_id_table ID, note_ID ----------- 1, 1 1, 2 1, 3 1, 4 3, 5 3, 6 4, 7 4, 8 4, 9 5, 10 note_value_table note_ID, note_value ----------- 1, AAAA1 2, BBBB1 3, CCCC1 4, DDDD1 5, AAAA3 6, EEEE3 7, FFFF4 8, GGGG4 9, HHHH4 10, IIII5 検索の対象にしたいのは、note_valueです。 今まで、「note_valueに検索文字列が含まれている」main_tableのレコードを取得していました。 SELECT main_table.* FROM main_table LEFT JOIN note_id_table ON main_table.id = note_id_table.id LEFT JOIN note_value_table ON note_id_table.note_ID = note_value_table.note_ID WHERE note_value_table.note_value LIKE '%AAA%' 上記クエリだと、note_valueにAAAを含んでいるnote_ID:1,5を持つ、 main_tableのID:1,3のレコード、2件が返ってきます。 これを、検索文字列のNOT検索とAND検索に対応させたいのです。 NOT検索について、 WHERE NOT(note_value_table LIKE '%AAA%') としてみたのですが、main_tableのID:1,3,4,5のレコードが返ってきました。 期待した動作は、main_tableのID:2,4,5でした。 まず、note_value_tableにデータを持っていないmain_table.id:2はNULLのようで、 この条件では無視されてしまうようです。 また、main_table.id:1,3が返ってきてしまうのは、 main_table.id:1に紐付いているnote_IDの内、2,3,4と main_table.id:3に紐付いているnote_IDの内、6に条件が引っかかってしまうようなのです。 AND検索ですが、上記クエリの条件を WHERE note_value_table LIKE '%AAA%' AND note_value_table LIKE '%BBB%' としたところ、0件となってしまいました。 期待した動作は、note_valueにAAAとBBBを含んでいるnote_ID:1を持つ、 main_tableのID:1のレコード、この1件が返ってくることでした。 どうもこの条件だと、一つのnote_valueにAAAとBBBが含まれていないとHITしないようです。 結局JOINしているので、note_valueの数だけ同じmain_tableが前にくっついてるイメージなんですよね。 main_tableのレコード末端に、紐付いているnote_valueのフィールドを横に繋げるか、 紐付いているnote_valueの文字列を連結したものを一つのフィールドとして解釈するようなことができれば 実現できるのかなぁと思いました。 試行錯誤の末に、パフォーマンスが非常に悪いんですが、下記クエリで機能的には実現できたのですが、 これでは使えないので何かいいアイディアなどあればご教授お願いしたいです。 サブクエリを使いたくないというのがあります。 --AAAの検索 JOINする時に検索してしまうようにしてみました。 また、そのためには、note_id_tableからnote_IDを取得できていないとだめなので、 サブクエリ化してみました。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table ON note_value_table.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table LIKE '%AAA%' WHERE note_value_table.note_value IS NOT NULL --AAAのNOT検索 WHERE条件を逆にするだけにしました。 --AAAとBBBの検索 検索条件1つに対して、JOINを増やしていくようにしました。 JOINが増えるのもそうですが、サブクエリも倍になってしまい、 検索条件を増やせば増やすほどパフォーマンスが落ちてしまいます。。 SELECT main_table.* FROM main_table LEFT JOIN note_value_table AS note_value_table1 ON note_value_table1.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table1 LIKE '%AAA%' LEFT JOIN note_value_table AS note_value_table2 ON note_value_table2.note_ID IN (SELECT note_ID FROM note_id_table WHERE main_table.id = note_id_table.id) AND note_value_table2 LIKE '%AAA%' WHERE note_value_table1.note_value IS NOT NULL AND note_value_table2.note_value IS NOT NULL

    • ベストアンサー
    • MySQL

専門家に質問してみよう