1

ユーザーがいくつかの施設を検索できるようにする MySQL ベースのアプリケーションを構築しています。施設は 1 つの TEXT 列に格納され、"|" で区切られたフィールドとして表されます。次に例を示します。

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

MySQL で施設の効率的な検索を実装する方法を知っていますか? ファシリティ 1、2、および 15 を「含む」すべての行を取得する必要があると仮定しましょう。クエリ/メソッドは何でしょうか? フルテキスト インデックスを使用しようとしましたが、うまくいきませんでした。

4

2 に答える 2

2

記号で区切られた文字列から特定の値を効率的に検索する方法はありません。

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

シナリオを最適化する最善の方法は、単一のインデックス付き INT 列を持つ子テーブルを作成し、各数値を個別の行に格納することです。次に、インデックスを使用して効率的に検索できます。

への私の回答も参照してくださいデータベースの列にカンマ区切りのリストを保存しているのは本当に悪いですか?

複数の施設が別々の行に格納されている場合の一致に関してsql-match-all、そのタイプの問題に対して Stack Overflow で使用されるタグを追加しました。それは頻繁に出てきますが、すでに多くの良い答えがあります。タグをクリックして検索します。

于 2011-12-30T22:36:19.173 に答える
0

FIND_IN_SET()関数を使用できます。ただし、これはカンマ区切りのリストでのみ機能するため、フィールドを前処理する必要があります。

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

インデックスを使用できない派生フィールドで検索を行うため、パフォーマンスはおそらくかなり悪くなります。設計を正規化し、それらの値を子テーブルに分割することをお勧めします。

于 2011-12-30T22:36:54.913 に答える