ホームページ >データベース >mysql チュートリアル >カンマ区切りの MySQL フィールドで複数の文字列を効率的に検索するにはどうすればよいですか?
MySQL: 複数文字列 find_in_set へのより効率的なアプローチ
MySQL の find_in_set
関数は、カンマ区切り値内の単一文字列の検索に限定されています。 これは、複数の検索文字列に一致するレコードを同時に検索する必要がある場合に課題となります。
課題:
目標は、カンマ区切り値を含むフィールドに指定された検索文字列すべてが含まれるレコードを識別することです。 たとえば、「a,b,c,d」内で「a,b,c」を検索すると、一致するものが得られます。
優れたソリューション:
find_in_set
演算子を使用して複数の OR
呼び出しを連鎖させる (これは非効率的になる可能性があります) 代わりに、より効果的な方法では、より構造化された FIND_IN_SET
句内で WHERE
関数を利用します。
<code class="language-sql">WHERE FIND_IN_SET('val1', setcolumn) > 0 AND FIND_IN_SET('val2', setcolumn) > 0 AND FIND_IN_SET('val3', setcolumn) > 0</code>
ここで:
setcolumn
は、カンマ区切りの値を持つフィールドを表します。val1
、val2
、val3
などは検索文字列です。説明:
このアプローチでは、AND
を使用して、すべての 検索文字列が setcolumn
に存在することを確認します。 各 FIND_IN_SET
呼び出しは、文字列が見つかった場合は位置を返します (0 より大きい値)。それ以外の場合は、0 を返します。AND
条件は、指定されたすべての文字列を含むレコードのみが返されることを保証します。
例:
<code class="language-sql">SELECT * FROM table WHERE FIND_IN_SET('a', setcolumn) > 0 AND FIND_IN_SET('b', setcolumn) > 0 AND FIND_IN_SET('c', setcolumn) > 0;</code>
このクエリは、setcolumn
に 'a'、'b'、および 'c' が含まれるレコードのみを返します。
重要な考慮事項:
この方法は通常、REGEXP アプローチよりも効率的ですが、カンマ区切りの値をデータベース フィールドに格納することは、多くの場合、不適切なデータベース設計であると考えられることに注意してください。データベースを正規化する (関係を表す別のテーブルを作成する) ことは、パフォーマンスとデータの整合性にとって、長期的にははるかに優れたソリューションです。 このアプローチは主に、既存の正規化されていないデータに対する回避策です。
以上がカンマ区切りの MySQL フィールドで複数の文字列を効率的に検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。