0

次のMySQLクエリがあります。

SELECT  *
FROM    customer
WHERE   
fName LIKE '%#attributes.q#%' AND deleted = 'N'
OR 
lName LIKE '%#attributes.q#%' AND deleted = 'N'

これは推測には問題なく機能しますが、完全に一致する場合: "Bill Clinton" fname = bill lname = clinton上記のクエリに対して0の結果が得られますか?ビルクリントが結果を出すところ。

このクエリを更新して、LIKE結果とEQUAL TO結果を検索するにはどうすればよいですか?

4

2 に答える 2

2

あなたの質問からはわかりにくいですが、あなたの顧客テーブルは次のようになると思います。

id    fName    lName      deleted
---------------------------------
1     John     Doe        N
2     Bill     Clinton    N
3     Fred     Smith      N
4     George   Bush       Y

質問で述べたように、クエリは次のように表示されるため、機能しません。

SELECT *
FROM customer
WHERE fname LIKE '%Bill Clinton%' AND deleted = 'N'
OR
  lName LIKE '%Bill Clinton%' AND deleted = 'N'

fNameまたはlNameフィールドに「BillClinton」が含まれているテーブルにはレコードがありません

#attributes.q#テキストをマッサージして、次のようなものを生成する必要があります。

SELECT *
FROM customer
WHERE ((fName LIKE '%Bill%') OR (fName LIKE '%Clinton%')) AND deleted = 'N'
OR
   ((lName LIKE '%Bill%') etc.....

LIKE比較は、ファイル名にワイルドカードを使用するのと非常によく似ています。彼らはあなたのためにテキストのブロックを分割しませんが、テキストのチャンクが別のテキストのチャンクの中に逐語的に存在するかどうかを教えてくれます。

必要なのは全文検索だと思います。これは、クエリ文字列内の個々の単語を考慮して結果を返します。もちろん、FULLTEXTはMyISAMテーブルタイプでのみ使用できるため、InnoDBまたはその他のタイプを使用している場合は、運が悪いことになります。

于 2010-03-15T05:04:34.187 に答える
0

参考までに-フルテキストインデックスは、InnoDBまたはMyISAMテーブルでのみ使用でき、CHAR、VARCHAR、またはTEXT列に対してのみ作成できます。

于 2018-12-17T18:00:38.817 に答える