QA@IT

【MySQL】INで値とカラム名を入れ替えた場合の部分一致検索

3231 PV

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46005&forum=26
こちらの質問を参考に、値とカラム名を入れ替えての条件指定が出来ることが分かりました。
しかし、上記URLでのクエリ文では完全一致のものしかヒットしないように思います。
部分一致(LIKE)での条件指定を行うには、どのようなクエリ文を書けばよいのでしょうか?

試しに、以下のように書いてみると、エラーで動きませんでした。
SELECT * FROM tbl WHERE 'word1' LIKE IN(col1, col2, col3) AND 'word2' LIKE IN(col1, col2, col3);

この場合では、LIKEは使用できないのでしょうか?
LIKEでなくても、部分一致検索が出来れば良いです。

お願い致します。

  • 例示された SQL 文の意図がよくわからないのですが「tbl テーブルの col1 か col2 か col3 に 'word1' を含む文字列があり、かつ、col1 か col2 か col3 に 'word2' を含む文字列がある行を取得」でしょうか? -
  • mysql> select * from test_1 where 'TEST' REGEXP CONCAT('^.*(', c1 , '|', c2, '|', c3 ,').*') ;

    こんなことしたいの?

    それとも別?

    -

回答

失敬、コメントにかいてしまった。
ここの入力欄みずらいw

mysql> select * from test_1;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | TES | NUL | NUL |
| 2 | NUL | TES | NUL |
| 3 | NUL | NUL | TES |
| 4 | NUL | NUL | NUL |
| 5 | VVV | NUL | NUL |
+----+------+------+------+
5 rows in set (0.00 sec)

mysql> select * from test_1 where 'TEST' REGEXP CONCAT('^.(', c1 , '|', c2, '|', c3 ,').') ;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | TES | NUL | NUL |
| 2 | NUL | TES | NUL |
| 3 | NUL | NUL | TES |
+----+------+------+------+
3 rows in set (0.00 sec)

mysql>

** 2013-02-01 追記

http://dev.mysql.com/doc/refman/4.1/ja/fulltext-search.html

あたりのことね

編集 履歴 (1)

返信ありがとうございます!
入力欄確かに見づらいですねww

この場合、'TEST'という完全一致での文字列のみヒットするのですか?
例えば、'TE'や'ES'といった検索後ではヒットしないのでしょうか?

色々考えた結果、一からテーブ設計しなおしたほうがいい気もします。
colは複数に分けずに、一つに空白文字などで分けるようにした方がいいのかも。。
テーブ設計、というよりDBそのものを初めて利用しますので、テーブ設計に慣れていません。

補足しておきます。
簡単なタグ検索システムを作ろうと思っています。
tag1, tag2, tag3に文字列が入っており、部分一致でのAND検索を行いたいのです。
例えば、以下のようなテーブルがあるとします。

|tag1|tag2|tag3|
|田中|東京|商品部|

・「田中 商品部」でAND検索した場合にヒットする。
・「田」「中」「東」「東京」などでもヒットする。
・「田 大阪」などではヒットしない。

各カラムは部分一致とし、ヒットしたものに対し、入力を受けた語句全てに部分一致する(AND)

以下の様なクエリ文でもできますが、もう少し最適化出来ないか、と思います。
SELECT * FROM test_tbl WHERE (tag1 LIKE '%word1%' OR tag2 LIKE '%word1%' OR tag3 LIKE '%word1%') AND (tag1 LIKE '%word2%' OR tag2 LIKE '%word2%' OR tag3 LIKE '%word2%');

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。