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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework

Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。

Q&A

解決済

2回答

3613閲覧

複数カラムに対してLIKE演算子の対象にカラム名を使いたい

Kai_teratail

総合スコア13

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework

Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。

0グッド

0クリップ

投稿2017/08/22 06:29

###複数カラムに対してLIKE演算子の対象にカラム名を使いたい

複数カラムに対してLIKE演算子の対象にカラム名を使いたいです。(↓こんな感じで)

[カラム1, カラム2……] LIKE '%対象カラム%'

調べたところ、CONCATを使う方法を見つけました。
が、データが数百件あるので重くて仕方ないです……。
他に良い方法は無いでしょうか?

MySQLに限らず、ZendPHPを使う方法もあれば教えていただきたいです。

SQLのイメージ

SQL

1CONCAT( IFNULL( column1, ' '), IFNULL( column2, ' ')…… IFNULL( column100, ' ')) LIKE CONCAT('%', target_column, '%')

SQLの組み立ては、PHPから↓のように作りました。

PHP

1$sql = "SELECT `colA`, `colB`"; 2$sql .= " FROM `table_name1`"; 3$sql .= " LEFT JOIN `table_name2` ON"; 4 5// カラムリストの配列(100個くらいある) 6$columnsArray = array('column1', 'column2',……'column100'); 7// カラムリストの作成 8$columnList = ""; 9foreach ($columnsArray as $column) { 10 $columnList .= "IFNULL( ". $column. ", ' '),"; 11} 12$columnList = substr($columnList, 0, -1); // 最後の「,」を削除 13 14$sql .= " CONCAT(".$columnList.") LIKE CONCAT('%', `target_column`, '%')"; 15

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

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

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

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

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

guest

回答2

0

そもそも速度を求めているのであれば
「LIKE '%対象カラム%'」自体辞めたほうがいいと思います
likeによる前方後方一致はインデックスが効かないはずです
(バージョンによって改善されている?)
複数キーワードを沢山のデータから抜き出すのであれば全文検索を利用するのが妥当です。

また複数カラムをまたいで検索したいのであれば、最初から正規化して
1カラムに集約すればすみます。運用でカバーして下さい

idabcd
1xxxx
2xxxx
3xxxx

のようなテーブル構成ではなく、以下のようにする

idcolmvals
1ax
1bx
1cx
1dx
2ax
2bx
2cx
2dx
3ax
3bx
3cx
3dx

投稿2017/08/22 07:44

yambejp

総合スコア114572

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

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

Kai_teratail

2017/08/22 08:35

yambejp様 回答ありがとうございます。 テーブル構成を変えるがきれいで良いですかね、 既存テーブルなのであまり触りたくないですが……ありがとうございます、打診してみます。
guest

0

ベストアンサー

複数カラムに対してLIKE演算子を行う場合は、それぞれのカラムへのWHERE句のLIKE演算をORでつなげると可能かと思います。

SELECT * FROM test WHERE A LIKE '%AA% OR B LIKE '%BB%;'

処理速度が遅い場合は、全文検索の仕組みを導入するか(MySQLならばFULLTEXTインデックス等、またはGroongaを導入してMroongaを使ったり、全文検索をElasticSearchに任せる等)、LIKEの対象カラムにインデックスを設定して、前方一致検索でindexが効くようにすると改善するかと思います。

投稿2017/08/22 06:36

編集2017/08/22 06:46
aro10

総合スコア4106

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

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

Kai_teratail

2017/08/22 07:37

aro10様 回答ありがとうございます。 ORで繋げる方法を試してみましたが、CONCATを使うよりも処理が遅くなってしまいました……????
aro10

2017/08/22 07:42

そうなると、全文検索用の仕組みを使うか、前方一致検索でindexが効くようにする必要があるかもしれませんね。 MySQL5.7であれば、ngramで全文検索の仕組みを使うと簡単に導入できます。 Laravelの記事ですが以下のような感じです [Laravel + MySQL5.7 で日本語全文検索をする方法とちょっとした注意点](http://qiita.com/niisan-tokyo/items/33c254bf8c4da3379ad1)
Kai_teratail

2017/08/22 08:12

MySQLのバージョンは5.5でした……(-_-;)が、全文検索ができるようになっていたんですね! ありがとうございます、バージョンアップも視野に入れてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問