2011-12-30 14 views
1

私は、ユーザーがいくつかの施設を検索できるMySQLに基づいたアプリケーションを構築しています。ファシリティは1つのTEXT列に格納され、 "|"で区切られたフィールドとして表されます。ここに例があります:MySQLで文字で区切られたテキストフィールドから項目を検索する

1|2|3|5|6|10|11|12|13|15|17|18|20|21|27|29|30|31|3... 

効率的なMySQL検索の実装方法はありますか?ファシリティ1,2、および15を「含む」すべての行を検索する必要があると仮定しましょう。クエリ/メソッドは何ですか?私は全文索引を使用しようとしていましたが、運が全くありませんでした。

ありがとうございます!

+1

はい。データベーススキーマを変更します。 **任意の*データベースでこのように検索またはフィルタリングする必要のあるデータは、** never **、** ever **(私は繰り返す、** never **、** ever **)のデータを保存する必要があります。 –

答えて

2

を効率よくの値でシンボル区切り文字列で検索する方法はありません。

SQLの効率を向上させる最も良い方法は、インデックスを使用することですが、インデックスを使用して部分文字列を見つけることはできません。

シナリオを最適化する最適な方法は、単一の索引付きINT列を持つ子表を作成し、各数値を別々の行に格納することです。次に、索引を使用して効率的に検索できます。

はまた、彼らは別の行に保存されているときに複数の施設をマッチングについてIs storing a comma separated list in a database column really that bad?

に私の答えを参照してください、私は問題のそのタイプのためのスタックオーバーフローで使用されているsql-match-allタグを追加しました。それは頻繁に起こり、良い答えがたくさんあります。タグをクリックして検索します。

+0

+1(リンクされた質問に+1も与えました)。カンマやデリミともにデータベースに4百万の質問があり、「しないでください」と答えた人は400万もありますが、誰かが同じことについて別の質問を投稿していますか? –

+1

@KenWhite:人々は自然に400万の質問に目を通したいとは思わないかもしれませんが、私はそれを責めません! :-) –

+1

また、答えは "それを*リレーショナル*データベースではしないでください"です。しかし、セットや配列のデータ型をサポートする他の非リレーショナルデータベースや個々の要素のインデックスが存在する可能性があります。 –

0

FIND_IN_SET()機能を使用できます。しかし、このコンマ区切りのリストでのみ動作し、あなたがあなたのフィールドを事前処理する必要があると思いますので:あなたは派生フィールドであなたの検索を行うことがありますので、

SELECT ... WHERE FIND_IN_SET('something', STR_REPLACE(your_text_field, '|', ',')); 

パフォーマンスはおそらく、かなり安っぽいとなり、そのインデックスの使用を排除します。デザインを正規化し、それらの値を子テーブルに分割する方が良いでしょう。

関連する問題