3

私のユーザーテーブルには、次のような情報を含む列「名前」があります。

Joe Lee
Angela White

姓名どちらかを効率よく検索したい。ファーストネームは簡単です、私はできます

SELECT * FROM user WHERE name LIKE "ABC%"

しかし、姓については、私がそうするなら

SELECT * FROM user WHERE name LIKE "%ABC"

それは非常に遅いでしょう。

そこで、入力の文字数を数えようかと考えています。たとえば、「ABC」は 3 文字で、name 列の最後の 3 文字だけを検索できれば、それは素晴らしいことです。だから私は何かが欲しい

SELECT * FROM user WHERE substring(name, end-3, end) LIKE "ABC%"

これを行うことができるMySQLには何かありますか?

本当にありがとう!

PS。検索エンジンがサポートしていないため、フルテキストを実行できません。

4

4 に答える 4

4

その理由

  WHERE name LIKE '%ith' 

家系の名前で「ジョン・スミス」を探すのが遅い方法は、

  WHERE Right(name, InStr(name, ' ' )) LIKE 'smi%'

または、列の他の式が遅いです。クイックルックアップのためのインデックスの使用を無効にし、MySQLサーバーに全表スキャンまたは全インデックススキャンを実行させます。

Oracleを使用している場合(つまり、以前は裕福な雇用主で働いていた場合)、関数インデックスを使用できます。そのままでは、検索を高速化するために、いくつかの列またはその他の役立つデータを追加する必要があります。

最も賢い方法は、名前と名前を別々の列に分割することです。他の何人かの人々はそれをする正当な理由を指摘しました。

それができない場合は、逆にした名前の文字列を含む追加の列を作成して、その列にインデックスを作成してみてください。その列には、たとえば、「JohnSmith」が「htimSnhoJ」として格納されます。次に、次のように検索できます。

 WHERE nameReversed LIKE CONCAT(REVERSE('ith'),'%')

この検索はインデックスを使用し、かなり高速になります。私はそれで良い成功を収めました。

于 2012-06-13T20:51:36.570 に答える
0

あなたは近くにいます。MySQLでは、以下を使用InStr(str, substr)して実行できる必要があります。Right(str, index)

 SELECT * FROM user WHERE Right(name, InStr(name, " ")) LIKE "ABC%"

InStr(name, " ")" "スペース文字のインデックスを返します (構文をいじる必要があるかもしれません)。このインデックスはRight()、姓のみを検索する関数で使用されます (基本的に、複数の名前、複数のスペースなどがある場合に問題が発生します)。LIKE "ABC%"次に、ABC で始まる姓を検索します。

3文字を超えるか3文字未満の名前は、提案どおりに正しく返されないため、固定インデックスを使用することはできません。

ただし、ゼーンが言ったように、別のフィールドを使用する方がはるかに優れています。

于 2012-06-13T19:43:51.000 に答える
0

MyIsam テーブルの場合は、フリー テキスト検索を使用して同じことを行うことができます。

于 2012-06-13T19:47:20.050 に答える
-1

REGEXP演算子を使用できます。

SELECT * FROM user WHERE name REGEXP "ABC$"

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

于 2012-06-13T19:44:42.323 に答える