2017-04-07 6 views
0

私は私のクエリ構文で、問題を抱えている:Mariadbフルテキストマッチ2列

SELECT `users`.`name`, `posts`.* 
FROM `posts` 
LEFT JOIN `users` ON `posts`.`user_id` = `users`.`id` 
WHERE MATCH (title,body) AGAINST('search') 

MATCHは私がそれを修正する方法をアドバイス取ってください...一つだけ、なしの両方で作業しているに...

+0

「AGAINSTa'?あなたはそれを "OR"か "AND"のどちらかにしたいですか? –

+0

申し訳ありません..列のタイトルと本文の両方の列で検索が必要です – user2579395

+0

はい、両方の列が ''search''に一致する必要がありますか?または** **十分ですか? –

答えて

0

"search"であることを確認するには、titlebodyの両方を使用することをお勧めします。 (私は質問とは無関係であるとしてusersを省略。)FULLTEXTを使用する場合

SELECT p1.* 
    FROM posts AS p1 
    WHERE MATCH(p1.title) AGAINST("search" IN BOOLEAN MODE) 
     AND EXISTS (
     SELECT * 
      FROM posts AS p2 
      WHERE MATCH(p2.body) AGAINST("search" IN BOOLEAN MODE) 
       ) 

、私はオプティマイザが効率的に二回FULLTEXTを適用する方法を知っているとは思わないので、これはそれを行うために取得するための卑劣な方法です。そう。

最初に単語が少ないと仮定してtitleを選んだので、もう一方のテストに進む必要がありません。

それ "インデックスマージが交差" このためでキックすることをことがあります

SELECT * 
    FROM posts 
    WHERE MATCH(title) AGAINST("search" IN BOOLEAN MODE) 
     AND MATCH(body) AGAINST("search" IN BOOLEAN MODE) 

で両方例を、あなたが必要両方

FULLTEXT(title), 
FULLTEXT(body) 

シングルフィート両方の列のインデックスは有用ではありません。

詳細については、SHOW CREATE TABLEEXPLAIN SELECT ...を入力してください。

ENGINE=MyISAMENGINE=InnoDBのいずれかが問題になる可能性があります。 2つの実装は全く異なります。