我的查询语法有问题:
SELECT `users`.`name`, `posts`.*
FROM `posts`
LEFT JOIN `users` ON `posts`.`user_id` = `users`.`id`
WHERE MATCH (title,body) AGAINST('search')
只能使用MATCH
一个,不能同时使用...请告诉我如何解决它...
要检查两者是否在"search"
and中,我推荐这种不明显的组合。(我忽略了与问题无关。)title
body
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)
在这两种情况下,您都需要:
FULLTEXT(title),
FULLTEXT(body)
包含两列的单个 ft 索引没有用处。
请提供SHOW CREATE TABLE
,EXPLAIN SELECT ...
如果您需要进一步讨论。
您是否拥有ENGINE=MyISAM
或可能很重要ENGINE=InnoDB
;这两种实现完全不同。