• ベストアンサー

文字検索 (LIKE)を使った場合

テーブル「USERS」の項目「FAMILY_NAME」「FIRST_NAME」をつなげた文字列に対して検索を行ないたいのですが、以下の「LIKE」を使ったSQL分ではカラムがないとエラーになるようです。 方法があれば教えて下さい。 よろしくお願いします。 テーブル:USERS 項目: FAMILY_NAME FIRST_NAME 値: 三木 直人 中川 三郎 SELECT CONCAT(FAMILY_NAME,FIRST_NAME) AS USER_NAME FROM USERS WHERE USER_NAME LIKE '%三%'

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

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

  • ベストアンサー
回答No.2

エラーにならなくはできますが、列の連結などの演算を行ったものを条件に指定すると、インデクスは利用できないと思いますよ? 【例1】 SELECT CONCAT(FAMILY_NAME,FIRST_NAME) AS USER_NAME FROM USERS WHERE CONCAT(FAMILY_NAME,FIRST_NAME) LIKE '%三%' 【例2】 SELECT USER_NAME FROM (SELECT CONCAT(FAMILY_NAME,FIRST_NAME) AS USER_NAME FROM USERS AS USR WHERE USER_NAME LIKE '%三%'

yoshi_t
質問者

補足

回答ありがとうございます。 教えて頂いた、【例1】のSQL文で、検索する事が出来ました。 ありがとうございます。 >インデックスは利用できないと思いますよ? 上記について教えて頂きたいのですが、 インデックスを利用出来なくなる事の弊害は、総てのレコードに対して「列の連結」⇒「検索」の処理を行なう事により、処理時間がかかるという認識でよろしいのでしょうか?

その他の回答 (2)

回答No.3

>インデックスを利用出来なくなる事の弊害 仮にFAMILY_NAME列、FIRST_NAME列にインデクスを定義していても、 インデクスは利用されず、母体データを全件検索することになります。 そのため、データ数が数千件程度ならそれほど影響はないでしょうが、 数万件、数十万件となれば、データ件数に比例して検索性能が劣化することになります。

yoshi_t
質問者

お礼

たいへん参考になりました。 ユーザー情報を登録しているテーブルなのでデータ数が増える事を前提に、検索機能を見直す事としました。 ありがとうございました。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

WHERE FAMILY_NAME LIKE '%三%' OR FIRST_NAME LIKE '%三%' でできませんか?

yoshi_t
質問者

補足

早速の回答ありがとうございます。 >WHERE FAMILY_NAME LIKE '%三%' OR FIRST_NAME LIKE '%三%' 上記の場合ですと。 '%中川三郎%'とした時に引っかからなくなってしまうのが困ってしまいます。 (検索文字列には、フォームに入力された値を入れようと思っています)

関連するQ&A

  • 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文

    http://okwave.jp/qa/q1599858.html この質問に疑問があります。 回答2で where (column1 || '/' || column2 ||'/' || column3) like '%word1%' ; というアドバイスに対して質問者は where ( concat( column1 , column2 , column3) like '%word1%' ) でできたと返しています。 なぜ、質問者はwhere ( concat( column1 , column2 , column3) like '%word1%' ) というSQL文にいたったのでしょうか? where ( concat( column1 , column2 , column3) like '%word1%' ) では、だめだったのでしょうか?

    • ベストアンサー
    • MySQL
  • LIKEで検索

    MySQL 4.0.20 + PHP で名前が入ったテーブルよりLIKEを使って検索すると全然関係のない名前まで引っ張ってきます。 SELECT * FROM `lady` WHERE name LIKE 'らむ' 上記で検索すると 「とも」って名前まで引っ張ってきます。 SELECT * FROM `lady` WHERE name LIKE 'らな' だと 「るる」って名前も引っ張ります。 どうも「ら行」の検索がうまく出来ないようです。 何か回避方法はあるのでしょうか? よろしく御願いします

    • ベストアンサー
    • MySQL
  • LIKEについてです。

    こんばんわ。プログラミング、データベース初心者です。 皆さんにどうしても教えて欲しいSQL文があります。 テーブルが3つあったとして、 1つはカラムに市町村のコードと名前が入ってるテーブルA、 2つめはカラムに色々なジャンルのコードと名前が入ってるテーブルB、 そして3つめにそれらのコードのみが入っていて、 色々カラムに他の情報が入ってる実際に使いたいテーブルCがあります。 例えば市町村名や町域で検索をかけた場合、 それを変数に入れて、 テーブルAでwhere句にてLIKE検索してコードを取り、 そのコードで紐づいたテーブルCからの情報を全部取りたいです。 一度に済ますにはどのようにSQLを書けばいいのでしょうか? 色々調べてみたのですが、全然わかりません。 回答いただけると大変ありがたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHPからのLIKE検索ができません。

    こんばんわ。お世話になります。 PHPからSQLを発行してLIKE検索をしようとしているのですがうまくいきません。(Xampp MySQL) $keyword = htmlspecialchars($_POST['keyword']); mysql_real_escape_string($keyword); $sql = "select * from master where name like '%{$keyword}%'"; テーブル内の name にマッチするはずの言葉があるのにマッチしません。 ちなみに echo $sql; とSQL文を表示させてPhpMyAdminでそれを実行すると、目的の検索結果が表示されます。 いろいろ検索してみたところ、LikeをLike Binary にする方法などがありましたが、どうにもうまくいきませんでした。文字コードはフォーム側、PHP・SQLともにUTF-8です。 '%{$keyword}%'あたりの書き方が悪いのでしょうか。 お手数おかけいたしますがアドバイスの程お願いいたします。

    • ベストアンサー
    • MySQL
  • likeの使い方

    mySQLの4.1を使っています。 nameカラムに"水辺の蜘蛛"というデータが1件入っています。 select * from myTable where name like "%の蜘蛛%" or name_eng like "%の蜘蛛%" では1件とれるのですが、 select * from myTable where name like "%蜘蛛%" or name_eng like "%蜘蛛%" では0件になります。 何故でしょうか。

    • ベストアンサー
    • MySQL
  • 大文字/小文字の区別しないで検索したい場合

    データベース:ORACLE9i いつもお世話になっています♪ いきなり質問ですが、 例えばこういうデータがテーブルに 入っているとします。 ID  NAME ----------- 1 AAA1 2 BBB2 3 CCC3 ----------- そこで下記のSQLを実行するとBBB2はヒットしません。 select * from test_tbl where name like '%b%'; 大文字/小文字を区別しないで検索する方法はないでしょうか? よろしくお願いします♪

  • Index の使い方、where a.カラム1 LIKE CONCAT

    Index の使い方、where a.カラム1 LIKE CONCAT(b.カラム2,'%') お世話になります。 テーブルA: id phone ----------------------------------- 1 819011112222 2 819022223333 3 81312345678 4 651112222 5 8699998888 6 819011112222 テーブルB: id Name Pref --------------------------------------------------- 1 Japan-1 8131234 2 JP-Mobile 8190 3 China-1 869 4 China-2 868 5 Japan-2 813 6 Japan 81 7 Singapore 65 このようなテーブルで、テーブルBはレコード数が数千件あります。 数千件でしたし、データを取るのに遅いとは思いますが、 なんとか耐えらえた範囲なので下記のように実行しておりました。 select a.*,b.Name,b.Pref FROM テーブルA a, テーブルB b where a.phone LIKE CONCAT(Pref,'%') group by a.id; 結果 id phone Name ---------------------------------------------------- 1 819011112222 JP-Mobile 2 819022223333 JP-Mobile 3 81312345678 Japan-2 4 651112222 Singapore 5 8699998888 China-1 5 862223333 China-2 6 819011112222 JP-Mobile テーブルB Prefに対してIndexを作成していますが、どうも作動していないようです。 Indexに関してよく理解できていなかったので、気にしていなかったのですが、今回早さを比べる為に Indexあり、なしで試しみても大して変っていませんでした。 今のところ、Indexを使えていなくても問題ないのですが、今後テーブルBのデータが数万件に増えてしまい、今までのやり方が通用しません。 効果的に使用する方法をアドバイス頂けませんでしょうか。 よろしくお願いします。

  • 複数カラム検索で、LIKE "%検索語%"

    複数カラム検索をしたいと思い、リンク先の通り、 WHERE concat(field1,char(0),field2) LIKE "%検索語%" としたらうまくいったのですが、 そのページに書いてあることが気になるので、教えてください ▽MySQLで複数フィールドから同一語を検索するには・・・ - MySQL - 教えて!goo   http://okwave.jp/qa/q2634613.html ・char(0)て何でしょうか? >%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない ・どういう意味でしょうか? ・全件検索する際は、LIKE検索を使わないのでしょうか? 全文検索エンジン(?)を利用するのでしょうか? ・全件検索しなければ(例えば2カラムだけ)、LIKE検索を利用しても良いのでしょうか? ・あるいは、データ規模が少なければ、LIKE検索を利用しても良いのでしょうか? >本番ではこんなことはしませんがあくまでも遊びということで ・どういう意味でしょうか? ・concatで LIKE 検索を普通はしない、ということでしょうか? ・それとも、LIKE 検索で、char(0)などのセパレータを挟まない、ということでしょうか? ・あるいは、全件検索でLIKE検索を普通は使わない、ということでしょうか?

    • ベストアンサー
    • MySQL
  • SQLiteのLike句で抽出できない

    SQLiteのLike句で抽出できないレコードがあります。 原因についてご教授いただけますでしょうか。 以下、操作手順になります。 ■データベースの作成 C:\>sqlite3.exe member.db SQLite version 3.7.15.2 2013-01-09 11:53:05 Enter ".help" for instructions Enter SQL statements terminated with a ";" ■テーブルの作成、レコードの追加 sqlite> create table t_member(name text, age integer); sqlite> insert into t_member values('山田一郎', 25); sqlite> insert into t_member values('田中次郎', 35); sqlite> insert into t_member values('鈴木三郎', 45); ■検索 sqlite> select * from t_member where name like '%一郎'; 山田一郎|25 sqlite> select * from t_member where name like '%次郎'; 田中次郎|35 sqlite> select * from t_member where name like '%三郎'; sqlite> 三郎だけが検索条件に適合しないのは何故でしょうか。 よろしくお願いします。