• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQL 副問い合わせ(IN)での部分一致検索)

MySQL副問い合わせ(IN)での部分一致検索の方法を教えてください

このQ&Aのポイント
  • MySQL ver.5.1を使用して、メールアドレス帳から特定のキーワードを含む行のみ選択する方法を教えてください。
  • 完全一致の場合は副問い合わせ(IN)を使用してSELECT文を実行できますが、部分一致の場合はどのように実現できるのかわかりません。
  • テーブルmail_listのname列の値がテーブルkeywordの値に部分一致する行を抽出するSQL文を教えてください。

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

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.2

こんな感じでいかがでしょう。 keyword を主にしたクエリです。 SELECT ml.* FROM keyword kw INNER JOIN mail_list ml ON (0<LOCATE(kw.name,ml.name)) GROUP BY ml.id; また、EXISTS を使う方法もあります。 SELECT * FROM mail_list ml WHERE EXISTS (SELECT 1 FROM keyword kw WHERE 0<LOCATE(kw.name,ml.name)); ちなみに正規表現や LIKE を使うのであれば、 keyword のデータに特殊文字が含まれる場合の注意が必要です。 例えば、正規表現では「(」「)」や「|」、LIKE では「%」や「_」などです。

faio5468ss
質問者

お礼

なるほど、、 LOCATEを使うんですね。両方式ともうまくいきました。 シンプルなSQL文で理解しやすかったです。 2パターンもご回答ありがとうございました。

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

その他の回答 (1)

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

正規表現でどうでしょう? SELECT * FROM mail_list WHERE name REGEXP ( SELECT group_concat(name SEPARATOR '|') FROM keyword )

faio5468ss
質問者

お礼

早速のご回答ありがとうございます。 ばっちり結果が得られました! REGEXPとgroup_concatの組み合わせですね。 スゴイ!大変勉強になります。

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

関連するQ&A

  • mysql 部分一致+ユニーク指定+最新 を表示

    mysql初心者です。 検索語句(search)で部分一致するものを、名前(name)と更新日(update)でユニーク指定し、修正日(time)が最新のものだけを表示させたいのですが、望む結果が得られません…。  SELECT * FROM db WHERE name LIKE \"%{$search}%\" GROUP BY name,update までは正しいと思うのですが、さらにtimeの最新を指定する方法を教えていただけませんか? よろしくお願いします。 いろいろ探して試行錯誤し、以下に行きついたのですが、部分一致がうまく機能しない時があります。(情報不足などあればご指摘ください。) SELECT * FROM db where (time) in (SELECT MAX(time) FROM db WHERE name LIKE \"%{$search}%\" GROUP BY name,update) (中略・件数を取得しページャーに使っています) SELECT * FROM db where (time) in (SELECT MAX(time) FROM db WHERE name LIKE \"%{$search}%\" GROUP BY name,update) ORDER BY time DESC LIMIT $start,10 (中略・whileとmysql_fetch_arrayで表示させています)

    • ベストアンサー
    • MySQL
  • mysqlで文字列が一致した数を求め並べ替えたい

    name | keyword   --------------------- イチゴ | 果物,赤,甘い,春 レモン | 果物,黄色,酸っぱい,種あり,柑橘類 ミカン | 果物,橙,甘い,酸っぱい,柑橘類,冬,こたつ ブドウ | 果物,紫,甘い,皮あり,種あり,ワイン 人参  | 野菜,橙,固い 大根 | 野菜,白,おでん,冬 このように、キーワードをコンマで分けているテーブルがあるとします。 例えば「果物」「甘い」「種あり」の三つのワードでkeywordを検索した時 name ------- ブドウ  (3ワード一致) イチゴ  (2ワード一致) ミカン  (2ワード一致) レモン  (1ワード一致) 上のように一致するキーワードが多い順に表示させたいのですがうまくいきません select name from tb where keyword like '%果物% or keyword like '%甘い% or keyword like '%種あり% order by count(name); これだと上手くいきませんが、意味的にはこのようにしたいと思ってます。 joinで同じテーブルを結合しても思うように行きませんでした。 何か良い方法があればご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLで検索されたフィールド

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

    • ベストアンサー
    • MySQL
  • キーワード \P が部分一致で検索できない。

    キーワード \P が部分一致で検索できない。 mysqlをutf8_unicode_ciで使っています。 検索キーワードに\Pと入力し、部分一致で検索すると、OMP,EEP等\Pと部分一致していない データも検索結果に表示されてこまっています。 \(バックスラッシュ)は特別な文字なので、\Pと入力しても、\(バックスラッシュ)は無視され、キーワード 「P」で検索されているようです。 今しようとしていることは、 検索キーワードを暗号化し、暗号化したキーワードで検索する処理です。 暗号化したキーワードはかなりの確立で\(バックスラッシュ)が含まれるので、 \(バックスラッシュ)を普通の文字列として検索したいです。 具体的には select * from testtbl where test like '%\\P%' このようなSQL分を実行した時、OMPやEEPが合致しないようにしたいのです。 よくわからなくなってきたので、アドバイス宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 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にて開発しています あるテーブル1とテーブル2を使って テーブル1のデータを列挙したいのですが うまく行かずエラーが出てしまいます 構造は以下のようになっています ----------------- テーブル1 ----------------- ID  DATE  MEMO 0   3/24   aaa 2   3/25   ccc ----------------- テーブル2 ----------------- ID   BUNRUI 0   A 1   B 2   A テーブル2のBUNRUIが'A'の行のID(上で言うと0と2)を テーブル1のID検索条件にして、 かつDATEが'3/24'の行を取得したく思っています 書いたSQL文は SELECT * FROM テーブル1 WHERE date='3/24' AND id IN(SELECT id FROM テーブル2 WHERE bunrui='A') です。 結果としてテーブル1のID=0 DATE=3/24 MEMO=aaa が取れると良いのですが... 「SELECT id FROM テーブル2 WHERE bunrui='」 が不正とエラーが出てしまいます (判り難い説明で申し訳無いです…) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • 複数カラムとの一致数の抽出ができません

    同一のデータベース内にある複数のカラムとの一致数を指定し、条件を満たしたものを抽出したいと思っていますが、SQL文が思いつかず困っています。どなたかよい知恵を授けてください。 [ID] N1 , N2 , N3 , N4 , N5 , N6 [01] 11 , 16 , 21 , 26 , 31 , 36 [02] 16 , 18 , 25 , 26 , 29 , 31 ↑というテーブルがあったとき、 例えば(11,16,21,25,31,34)という数値(A)を与えて、N1~N6に入っている数値と比較したとき、4個一致した行を抽出したい時はID=01を返し、3個一致した行を抽出したい時はID=02を変えすSQLはどういうものにすればいいでしょうか? 一致する個数のみに着目し、一致する数値はどれでもいいものとします。 ちなみに可能であれば、IDは300程あるので、できれば処理時間の関係上スマートにしたいと思っています。 ニュアンスとしては SELECT ID FROM table WHERE (SELECT count(*) FROM table WHERE (n1,n2.n3.n4.n5.n6) IN (11,16,21,25,31,34))=4; のようにしたいと思いましたがINの使い方の問題でしょうか、エラーが帰ってきます。

  • select文、部分一致で複数のキーワードを使う

    以下の環境で運用しています。 MySQL 5.0.45  PHP 5.1.6 完全一致でしたら、in ('キー1','キー2') でよいと思うのですが 部分一致で、キーワードを複数設定する方法が分かりません。 以下の文でいいかと思いましたが、`flg1` が0で無いものも表示します。 ※or の使い方が間違っているのだと思います select * from `meibo` where `flg1`= '0' `jyuusyo` like '%東京%' or `jyuusyo` like '%大阪%' よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • sqlparamaterでIN句を使いたい。

    C♯での開発です。 引数で、カンマ区切りの文字列を受け取って、それをIN句に使ったSQLを発行 したいのですが、これをsqlparamaterで出来ないか悩んでいます。 キーが決まった数しかこないのであれば、 command.CommandText = "SELECT * FROM Table1 WHERE NAME IN (@name1,@name2)"; こんな感じでいいんでしょうが、動的である場合、どうしたら良いのでしょうか?

  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL