1

usersfirstnameとを含むという名前のテーブルがあります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 クエリを作成する必要がありますか?

4

2 に答える 2

1

FULLTEXT検索を使用しないスキーマ設計を考えると、MySQL 内でこれを効率的に実行できるかどうかを尋ねると、単純な答えはノーです。これを効率的に実行することはできません。

LIKE/STRCMPおよび/または文字列関数を使用して、奇抜なクエリを作成できます。このアプローチを取る場合は、すべてを処理できる 1 つのクエリを作成するよりも、クエリをインラインで作成するアプリケーション ロジックを作成する方がはるかに優れています。いずれにせよ、真に効率的である可能性は低い

MySQL 5.6 には、INNODB 内でFULLTEXT検索を実行する機能があります。下位バージョンを使用している場合、MyISAM テーブルでのみこれを行うことができます。MyISAM が良い考えではない理由はたくさんあります。

別のアプローチは、 LuceneSphinx、またはXapianなどの実際の検索ソリューションを調べることです

于 2013-03-02T19:38:11.930 に答える
0

正規表現を試しましたかhttp://dev.mysql.com/doc/refman/5.1/en/regexp.html

于 2013-03-02T20:06:19.267 に答える