users
列firstname
とを含むという名前のテーブルがありますlastname
。
一致した名、姓、名とスペースと姓、および姓とコンマと名の結果を返すように WHERE 句を構成する方法に苦労しています。たとえば、「John」、「Doe」、「John Doe」、「Doe、John」などです。部分的なパッチ (つまり、"John D") でも機能するはずです。以下のようなものを考えています(?を検索語に置き換えてください)。
SELECT * FROM people WHERE
firstname LIKE ?
OR CONCAT_WS(" ",firstname,lastname) LIKE ?
OR lastname LIKE ?
OR CONCAT_WS(", ",lastname,firstname) LIKE ?
「John Doe」で検索すると「John Enders」、「John Flaggens」、および「John Goodmen」も返されるため、このアプローチには少し欠陥があります。両方が与えられた場合、姓は一致します。
WHERE 句にインデックスの使用を妨げ、パフォーマンスを大幅に低下させる関数があるため、このアプローチには大きな欠陥もあります。
WHERE 句で関数を使用せずに SQL だけを使用して効果的にこれを行うことができますか、またはサーバー コード (つまり、PHP) を使用して、指定された検索フレーズのスペースとコンマを解析し、結果に基づいて動的 SQL クエリを作成する必要がありますか?