2016-03-19 21 views
3

データベースに商品テーブルがあります。データベースエンジンはinnodbです。データベース列の文字列を検索

ここで、productテーブルにproduct_nameフィールドがあります。ここでは、商品名が指定された文字列と一致する商品テーブルのすべてのレコードを取得したいと考えています。

たとえば、ラップトップはproduct_nameで、私の文字列は「ラップトップがほしい」です。さて、文字列に含まれているproduct_nameを探したいと思います。

私のようなクエリを書かれている。なぜなら、私のデータベースエンジンはInnoDBの(使用テーブルタイプがFULLTEXTインデックスをサポートしていません)

SELECT * FROM product WHERE MATCH (product_name) AGAINST ('I want laptop'); 

しかし、このクエリは、のようなエラーがスローされます。だから私はそれの代わりに書く必要がありますか?

答えて

1

あなたの問題を解決するには、フルテキスト検索を(場合には、あなたが前に5.6にMySQLバージョンを使用)をサポートしているMyISAMにあなたのあなたのテーブルのエンジンの種類を変更する

  • のどちらかが必要になります。
  • またはInnoDB Full-Text Search(MySQLバージョン5.6以降)を使用してください。
+0

私はinnodbエンジンをMyISAMに変更しましたが、同じエラーが発生し、私のSQLバージョンは5.5.44-37.3-log - Percona Serverです。 –

+0

エンジンタイプが正しく設定されていますか?ターミナルの 'show table status where name = 'product';と入力し、エンジンタイプを確認してください。@ Nisarg ' –

+0

はい。私はそれについて確信しています。私はexuecuteあなたのクエリはMyISAMとしてenigineを与えることです。 –

1

あなたは二重のワイルドカードでlikeを使用することができますが、DBはテーブルスキャンを行うことを余儀なくされますので、ダブルワイルドカードクエリはインデックスを使用できないため、クエリが非常に遅くなります。

SELECT * FROM product WHERE 'I want laptop' LIKE CONCAT('%',product_name,'%'); 
+0

誤ってラップトップの代わりにラップトップを書くことができるので、行が書き込まれない場合。しかし、私はその行が欲しいので、どのようなクエリを書く必要がありますか? –

+0

@Nisarg同等の代替手段はないと思います – FuzzyTree