人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

[MySQL] タグを含むテキストを項目に格納している場合、タグを除いたテキストで検索をかけることはできますか?

別カラムにタグを除いたテキストを格納しておくしかないのでしょうか?text型だとレコード長が大きくなるのでできればそれはやりたくないです。なにかいい方法はないでしょうか?

●質問者: k2017
●カテゴリ:ウェブ制作
✍キーワード:MySQL カラム タグ テキスト レコード
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● m-nisi
●27ポイント

例えば、テストこんな感じで格納されてるのですか?

とすると、

where key like '<%>テスト</%>'

こんな感じでいけないでしょうか?

見当違いなら申し訳ないです。

◎質問者からの返答

ありがとうございます。

テスト

で格納されているとすると、

where key like '%strong%'

でマッチしてしまいます。

'テスト'にはマッチするけど'strong'にはマッチしないという方法を知りたいのです。


2 ● m-nisi
●27ポイント

今、WindowsのMySQL5で試した所、

前述した方法で出来ましたよ。

where key like '%strong%'

ではなくて

where key like '<%>strong</%>'

です。

テストに用いたデータは

> select * from test;

+----------+---------------------------+

| id | text |

+----------+---------------------------+

| 1 |<strong>test</strong>|

| 2 | <b>test2</b> |

| 3 | <i>test3</i> |

| 4 | <a>test4</a> |

| 5 | <div>strong</div> |

+----------+--------------------------+

です。

>select * from test where text like '%strong%';

+----------+---------------------------+

| id | text |

+----------+---------------------------+

| 1 |<strong>test</strong>|

| 5 | <div>strong</div> |

+----------+--------------------------+

となりますが、

> select * from test where text like '<%>strong</%>';

とすると

+----------+---------------------------+

| id | text |

+----------+---------------------------+

| 5 | <div>strong</div> |

+----------+--------------------------+

こうなります。

strongがタグ名にもテキストの中にも含まれてた時に、

タグの方は引っかからないという事です。

例えば、以下のようにすると、

> select * from test where text like '<%>div</%>'

何もひっかからないです。

あと、<と>は全て半角で記述してください。

汚い表ですみません。

はてなさん、勝手にタグ解釈とかパイプ解釈とかするから

こういうの書きづらい。

◎質問者からの返答

ありがとうございます。そうですね、前述の方法でできますね。すみません。

ただ、質問では省略しましたがデータは

・タグが入っているかどうか分からない

・タグが入れ子になっている可能性もある

という感じでも上手くいくようにしたいです。


3 ● kamekichi3
●26ポイント

>・タグが入っているかどうか分からない

>・タグが入れ子になっている可能性もある

ということでは完全なる不確定要素となってしまい条件として使えない気がします。

ストアドプロシージャで対応したり、抜き出したデータをプログラム側で正規表現置換をかけ、タグの部分を削除してしまった方が簡単なのではないでしょうか?

どうしてもSQLで実現しないといけない理由があるようでしたら、横レスになってしまってすみません。

◎質問者からの返答

ありがとうございます。

もしMySQLに「あるデータ型ならselectでタグを削除してから検索してくれる」とか「selectのときにこの関数を挟めばタグを無視して検索してくれる」とかそういう機能があればいいなと思って質問してみました。

できなければそれはそれで仕方ないですね。

textカラムをほぼ同じ内容で持つのはどうもスマートではないような気がしてなりません。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ