我遇到问题,我的查询语法是:
SELECT `users`.`name`, `posts`.*
FROM `posts`
LEFT JOIN `users` ON `posts`.`user_id` = `users`.`id`
WHERE MATCH (title,body) AGAINST('search')
MATCH
只与一个人合作,两者都没有......请告诉我如何修复它......
答案 0 :(得分:0)
要检查"search"
是否在中 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)
在两个案例中,您需要 both :
FULLTEXT(title),
FULLTEXT(body)
包含两列的单个ft索引无效。
如果您需要进一步讨论,请提供SHOW CREATE TABLE
和EXPLAIN SELECT ...
。
您是ENGINE=MyISAM
还是ENGINE=InnoDB
可能很重要;这两种实现完全不同。