0

我的查询语法有问题:

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

只能使用MATCH一个,不能同时使用...请告诉我如何解决它...

4

1 回答 1

1

要检查两者是否在"search"and中,我推荐这种不明显的组合。(我忽略了与问题无关。)titlebodyusers

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) 

这两种情况下,您需要:

FULLTEXT(title),
FULLTEXT(body)

包含两列的单个 ft 索引没有用处。

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

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

于 2017-04-08T05:30:13.873 回答