質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

31789閲覧

複数のカラムをまたいで検索するには、どの様にすれば良いのでしょうか?

raguel

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2016/04/17 04:59

|--|------|------|
|no|miyoji|namae |
|--|------|------|
|01|山田 |太郎 |
|--|------|------|
|02|田中 |次郎 |
|--|------|------|
|03|鈴木 |三郎 |
|--|------|------|

上記の様なテーブルがあります。

1つのカラムだったら、
SELECT * FROM test WHERE miyoji LIKE '%山田%'";
で良いと思うのですが
「山田太郎」とか「山田太」で検索した場合、
|--|------|------|
|01|山田 |太郎 |
|--|------|------|
を検索結果として該当させたいと思います。

上記の様な結果を表示するには、どのようなクエリーを実行すれば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

sql

1SELECT * FROM test WHERE CONCAT(miyoji,namae) like '%田太%'

で可能です。

補足:
ちなみにmiyojiとnamaeでインデクスを作成しないとテーブル全検索になってしまいますので、miyojiとnamaeでインデクスを作成すれば、インデクスを使った検索が可能です。

投稿2016/04/17 06:29

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/04/17 18:17

質問に対する回答としては正しいのですが、 > miyojiとnamaeでインデクスを作成すれば、インデクスを使った検索が可能です。 は、誤りです。 理由は2つあり、 1つ目はワイルドカード("%"および"_")で始まる値との比較ではインデックスを使用できないこと、  http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html 2つ目は、信頼できる情報源が見つからないので何ですが、(concatなどの)関数を適用したカラムは、インデックスを使用できなくなること  http://dba.stackexchange.com/questions/45840/index-mysql-concatenated-columns です。
A-pZ

2016/04/18 08:32

なるほど、mysql5.6での日本語リファレンスでも以下の様な記述はありましたね。 LIKE '%string%' を使用し、string が 3 文字より長い場合、MySQL は Turbo Boyer-Moore アルゴリズムを使用して、文字列のパターンを初期化してから、このパターンを使用して検索をより迅速に実行します。 しかしEXPLAINで結果を出すと、複合インデクスを使っている旨を出すので、EXPLAINの結果そのものは「使う候補にあげてる」けれど、「それは本来のインデクスではない」可能性と、「インデクスを使わない可能性はありそう」ということですね。 指摘ありがとうございました。
guest

0

1.テーブル変更で対応
miyojiカラムとnamaeカラムを結合したhogeカラムを追加し、hoge LIKE '山田%'で検索する

2.SQLで対応【その1】
WHERE (miyoji LIKE '山田%' OR namae LIKE '山田%')

3.SQLで対応【その2】
CONCATを利用してmiyojiとnamaeを連結します。
※インデックスはきかないです。
WHERE CONCAT(miyoji, namae) LIKE '山田%'

4.SQLで対応【その3】
UNIONを利用して別々に条件を指定する。
SELECT * FROM HOGE
WHERE miyoji LIKE '山田%'
UNION
SELECT * FROM HOGE
WHERE namae LIKE '山田%'

explainで一番早くなりそうなSQLを探してみるしかないですが、、
私なら1のテーブル変更にします。

投稿2016/04/17 05:12

LILI.IRON.FIST

総合スコア151

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unau

2016/04/17 05:28

2, 4 は「山田太」での検索( LIKE '%山田太%' ) で引っかからないのではないでしょうか。 2 と同じことですが、CONCAT したカラムを持つ view を作るのも手でしょうね。
LILI.IRON.FIST

2016/04/17 06:05

そうですね。前にも%が必要ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問