4

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

SELECT * 
FROM products 
LEFT JOIN descriptions ON products.DescriptionID = descriptions.ID 
WHERE MATCH (name, overview, specs) AGAINST ('ram');

検索しようとしているすべての列MATCH() AGAINST()は FULLTEXT ですが、phpMyAdmin でテストすると次のエラーが発生します。

#1210 - Incorrect arguments to MATCH

列が 1 つしかない場合MATCHはエラーにならず、正しく動作しますが、複数の列を作成しようとするとすぐにMATCHこのエラーで失敗します。MySQL 5.0.45 を実行していますが、MySQL 5.0 全文検索機能のドキュメントでは、これを実行できることが示されています。

のせいLEFT JOINですか?一連の関数呼び出しをORまとめる必要がありますか?MATCH() AGAINST()

更新 @Zak:テーブル作成ステートメントを投稿することはできませんが、この例では列は次のように言えます: products.namedescriptions.overviewdescriptions.specs。それらを完全なtable.column形式で指定しても、動作は変わりません。

products.nameただし、から負けるMATCH()と、次のエラーが表示されます。

#1191 - Can't find FULLTEXT index matching the column list

ただし、 と は両方ともdescriptions.overviewFULLTEXTdescriptions.specsです。

4

2 に答える 2

15

への引数MATCH()は、FULLTEXT インデックス定義内の同じ列である必要があります。それらは、位置だけでなく数も同じでなければなりません。

MATCH()また、異なるテーブルの複数の列でインデックスを作成することはできないため、1 回の呼び出しで異なるテーブルの列と照合することはできません。

MATCH()異なるテーブルからテキスト列を検索する場合は、各テーブルに FULLTEXT インデックスを作成してから、個別の呼び出しで各インデックスを検索する必要があります。式を使用ORして結果を結合します。

于 2009-11-10T23:41:40.913 に答える
6

私は同じ問題に遭遇しました。問題は、異なるテーブルの列を一致させることができないため、クエリを分割する必要があることです。

次のようなものを試してください(列とテーブルに一致するように編集されています):

SELECT p.name, d.overview, d.specs
FROM products AS p 
LEFT JOIN descriptions AS d ON p.DescriptionID = d.ID 
WHERE MATCH (p.name) AGAINST ('ram')
OR MATCH (d.overview, d.specs) AGAINST ('ram');

それが役に立てば幸い!

于 2009-11-10T23:47:08.263 に答える