• ベストアンサー

条件検索の方法について

フィールド (name) に「いちごがむ」「いちごじゅーす」「みかんがむ」「みかんじゅーす」がある場合、文字の先頭に『いちご』がつく情報を抽出するsql文は以下になります。 SELECT * FROM test WHERE name LIKE 'いちご%' では、フィールド (name) に「いちご」「みかん」があるとします。 検索文字『いちごがむ』(もしくは『いちごじゅーす』)からnameの「いちご」箇所を抽出するにはどのようなsqlを発行すればよいのでしょうか? よろしくお願いします。

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

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

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

select * from test where 'ももたろうは鬼をたいじしました' like concat(name,'%') とすればよいですが、SQL的にはかなり効率がわるいので実用に 耐えないかもしれないですね。

mogrin_001
質問者

お礼

スピードを比べてみたらconcatの方が多少速かったので、今回はこちらを使わせていただきます。 ありがとうございました。

mogrin_001
質問者

補足

concatという関数があったのですか! a like 'b%'  の真逆のsqlが  'b' like concat(a'%') で発行できるのですね、すばらしいです。 >>SQL的にはかなり効率がわるいので実用に耐えないかもしれないですね。 NO2さんの方法と、NO3さんの方法のどちらでも期待通りの動作が実現できるのですが、どちらの方法が適しているでしょうか? それとも、違う方法を考えたほうがよろしいでしょうか? ps. アクセス集計サイトはどのようにドメインを取得しているのでしょうかね・・・、疑問です。

その他の回答 (3)

回答No.4

#1、#2回答者です。 検索条件で列名(今回の場合は、name列)を加工(部分抽出など)せずに条件式に指定することで、インデクスを利用できるかと思ったのですが、explainの結果では#2回答のような指定でもMySQLではインデクスを利用してくれないようです。 したがって、今回のような操作では、母体件数に比例して処理時間がかかります。 そういう点に留意した上で、実装して良いかの判断をしてください。

回答No.2

#1回答者です。 文章から、キーワードを検索するのですか? すごい発想ですね。 キーワードから文章を検索するというのが、普通の発想なのですけどね。 文章の先頭には、必ず検索したいキーワードがあるのでしょうか? 例えば、 「○○○は~」 「××を~」 といった形式でしょうか? あと、これは趣味などで行うのでしょうか? もし仕事なら、発想を考え直したほうがいいです。 以上の条件がOKなら、以下のSQLで希望の結果を得られると思います。 ===表定義例=== create table test (id int, name varchar(30)); ===格納データ例=== insert into test values (1,'いちご'),(2,'みかん'),(3,'ぱいなっぷる'),(4,'もも'),(5,'ももたろう'); ===検索SQL例=== select id,name from test where name=substring('ぱいなっぷるはコンビニに100円で売っています',1,char_length(name)); select id,name from test where name=substring('いちごがむを昨日食べました',1,char_length(name)); select id,name from test where name=substring('ももが大好きです',1,char_length(name)); select id,name from test where name=substring('ももたろうは鬼をたいじしました',1,char_length(name));

mogrin_001
質問者

補足

char_length(name)でnameの長さを取得して、substringでキーワードを切るのですか! いやすごいです、sqlでこんな方法があるとは知りませんでした。 実は、自分のHPのリンク集に載っているサイトのみを対象とした逆アクセスランキングを、phpとmysqlを用いて設置しようと思いたちました。 sitename      url             count -------   ----------------      ------- あ      http://aaa.com/          10 い      http://bbb.com/           8 う      http://ccc.com/sub1/       15 え      http://ccc.com/sub2/       15 実装にあたり、リファラー( http://aaa.com/aa.html 、  http://aaa.com/aa.php?hoge=7 など) と データベースフィールドurlとの関連付けが必要なのですが、リファラーを直接データベースフィールドurlにヒットさせることができれば、カウントアップ等のプログラムを一番手っ取り早く作れますので、どうにかできないものかと当質問をさせていただきました。 >> もし仕事なら、発想を考え直したほうがいいです。 仕事というわけではないのですが、この方法はやめたほうがよろしいでしょうか? たしかに、すべてのurlに対し char_length と substring を施すので、リンク数が多くなると、動作が重くなるような気がします。(sqlは詳しくないので、なんともいえませんが・・・)

回答No.1

質問内容が不明確です。 検索する基の表のデータと、得たい結果を示すと、回答する側も分かりやすいです。 >では、フィールド (name) に「いちご」「みかん」があるとします これは、格納済データのことですよね? この文と、この文以降は、どういう関係があるのでしょうか? >検索文字『いちごがむ』(もしくは『いちごじゅーす』)からnameの「いちご」箇所を抽出するには 最初に示された 「SELECT * FROM test WHERE name LIKE 'いちご%'」 で検索した結果から、「いちごがむ」といった列値が検索された場合、「いちご」部分だけを抜き出したいのですか? MySQLのバージョンは、何ですか?MySQLでは、4.0以前と4.1以降で、この辺の仕様が変わっています。 「いちご」部分だけを抜き出したいなら、 MySQL 4.0までなら、「select substring(name,1,6) from ~」 MySQL 4.1からは、「select substring(name,1,3) from ~」 といった記述で可能です。 意図が違っていたら、補足説明してください。

mogrin_001
質問者

補足

質問内容が不明確で申し訳ありませんでした。MySQLのバージョンは5.0です。 テーブル名 test   id       name ----    --------- 1      いちご 2      みかん 3      ぱいなっぷる 4      もも 5      ももたろう ----   ---------- 以上のテーブルがある場合、 『ぱいなっぷるはコンビニに100円で売っています』という検索文字では「3,ぱいなっぷる」がヒット。 『いちごがむを昨日食べました』という検索文字では「1,いちご」がヒット。 『ももが大好きです』という検索文字では「4,もも」がヒット。 『ももたろうは鬼をたいじしました』という検索文字では「4,もも」と「5,ももたろう」がヒット。 このような検索結果が得られるには、どのようなSQL文になるのか知りたかった次第であります。ちなみに、検索は前方一致(最初の文字列が同じならヒット)を望んでいます。 よろしくお願いいたします。

関連するQ&A

  • sjisでのあいまい検索を教えてください

    Postgres8です。 データベースのエンコーディングは【SQL_ASCII】です。 LIKE検索をした場合のSJISの文字化けに対する対処方法を教えてください あいまい検索をしたいのですが、 文字化け対象文字を含む場合、 どのように記述すればいいのですか? select * from aaa where name = 'パソ\コン'; 上記のように完全一致で検索をすると抽出できます。 select * from aaa where name like '%パソ%' 上記のよう指定してlike検索をしても抽出できます。 しかし以下の場合どちらでも抽出できません。 select * from aaa where name like '%パソコ%' select * from aaa where name like '%パソ\コ%' よろしくお願い致します。

  • 除外抽出条件

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

  • 大文字小文字を識別しない検索方法について

    DBに例えば、nameフィールドに"SUzuKI"と登録されていたとします。 この場合に、SQLで、"select * from table where name LIKE '%uzuki%';"と検索してもヒットしません。大文字小文字を判別するからです。大文字小文字を判別しない検索方法についてお分かりになる方がいらっしゃいましたら、ご教示をお願いいたします。 よろしくお願いいたします。

  • ワイルドカードの検索

    項目に'%'が入力されているデータを抽出したいのですが、 以下のようなSQLだとデータがすべて抽出されていまいます。  SELECT *   FROM t_table  WHERE code_name LIKE '%%%' '%'を検索するにはどうのようにすればいいのでしょうか?

  • 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
  • データベースのワイルドカードは%ではないの?

    アクセスのテーブルに あ い う があり、 SQL文で *********************************************** SELECT テーブル1.フィールド FROM テーブル1 WHERE (((テーブル1.フィールド) Like "%あ%")); *********************************************** としてもエラーにならないけど、「あ」が抽出されません。 *********************************************** SELECT テーブル1.フィールド FROM テーブル1 WHERE (((テーブル1.フィールド) Like "*あ*")); *********************************************** にすると、「あ」が抽出されます。 アクセスなどのデータベースのワイルドカードは%だと思っていたのですが違うのですか?

  • 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
  • SQL ?で終わる

    アクセスのSQL文で、テーブルのフィールドの値が、最後が?で終わるものを抽出したいのですが SELECT テーブル.フィールド FROM テーブル WHERE (((テーブル.フィールド) Like "[*?]")); これだと1件も抽出されません。 Like "[*?]"が間違ってると思うのですが、どうすればいいでしょうか?

  • 「・」中点が入った文字列を条件にするとデータを抽出できないです

    「・」中点が入った文字列を条件にすると データを抽出できないです。 うまくいかない例 ------------------------------------------- $name = "春・春・春"; $Sql = "SELECT * FROM TestList"; $Sql .= " WHERE SpName = '".$name."'"; ------------------------------------------- 条件を変数に格納してSQL文に渡すと何も抽出できません。 しかし↓のようにSQLに直に「春・春・春」とすると うまくデータが抽出されます。 うまくいった例 ------------------------------------------- $Sql = "SELECT * FROM TestList"; $Sql .= " WHERE SpName = '春・春・春'"; ------------------------------------------- また「・」中点がない条件では変数で渡しても データがうまく抽出されます。 どうしたら「・」中点が入っている条件を 変数に格納してSQLに渡しても うまくデータが抽出されるでしょうか? どなたかご教示いただけますと助かります。 よろしくお願いします。

  • <SQL>条件付きで最小値レコードを抽出する方法

    SQLite3.7.5を使っています。 以下<抽出前>の様なテーブルから、col2の値が"FALSE"で(col1=3,4,5の3つ)かつ、col3が最小値(col3=3)であるレコードを<抽出後>のように抽出するSQL文をご教示ください。 <抽出前> col1 | col2 | col3 1 | true | 3 2 | true | 0 3 |false | 3 4 |false | 5 5 |false | 3 <抽出後> col1 | col2 | col3 3 |false | 3 5 |false | 3 自分で考えたSQL文は以下です。 抽出結果は問題ないのですが、同じSELECT文を2回書いていてだいぶ効率悪いことをしているのではないかと思い質問しました。 よろしくお願い致します。 SELECT * FROM (SELECT * FROM test WHERE (col2 = false)) WHERE col3 = (SELECT min(col3) FROM (SELECT * FROM test WHERE (col2 = false)))