Mariadb全文匹配两列

时间:2017-04-07 11:40:16

标签: mysql mariadb mariasql

我遇到问题,我的查询语法是:

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

MATCH只与一个人合作,两者都没有......请告诉我如何修复它......

1 个答案:

答案 0 :(得分:0)

要检查"search"是否在 titlebody,我建议使用这种不明显的组合。 (我遗漏users与问题无关。)

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时,我不认为优化器知道如何有效地应用FULLTEXT两次,所以这是一种偷偷摸摸的方法来实现它。

我首先选择title,假设它的单词较少,因此不需要再进行其他测试。

可能是"索引合并相交"将为此开始:

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

两个案例中,您需要 both

FULLTEXT(title),
FULLTEXT(body)

包含两列的单个ft索引无效。

如果您需要进一步讨论,请提供SHOW CREATE TABLEEXPLAIN SELECT ...

您是ENGINE=MyISAM还是ENGINE=InnoDB可能很重要;这两种实现完全不同。