我有以下查询,它针对MySQL Innodb数据库中相同搜索词的两个不同表中的两列执行全文搜索;
SELECT Id,
MATCH (tb1.comment, tb2.comment) AGAINST (+'search term' IN BOOLEAN MODE) AS Relevance
FROM tbl1
LEFT JOIN tb2 ON tb1.Id = tb2.Id
WHERE MATCH (tb1.comment, tb2.comment) AGAINST (+'search term' IN BOOLEAN MODE)
HAVING Relevance > 0
如果我在tb1.com上执行MATCH它工作正常,我会收回相关的搜索条件,但我想对两个列执行它。
但是因为另一个表是LEFT JOIN的可选项,如果没有匹配的ID,它不会返回任何内容。关于如何克服这个问题的任何想法?
答案 0 :(得分:8)
我设法弄清楚以下的工作似乎表现良好并给出我想要的结果;
SELECT Id,
MATCH (tb1.comment) AGAINST (+'search term' IN BOOLEAN MODE) AS Relevance1,
MATCH (tb2.comment) AGAINST (+'search term' IN BOOLEAN MODE) AS Relevance2
FROM tbl1
LEFT JOIN tb2 ON tb1.Id = tb2.Id
WHERE (MATCH (tb1.comment) AGAINST (+'search term' IN BOOLEAN MODE)
OR MATCH ( tb2.comment) AGAINST (+'search term' IN BOOLEAN MODE))
HAVING (Relevance1+Relevance2) > 0
ORDER BY (Relevance1+Relevance2) DESC
答案 1 :(得分:2)
您无法匹配不在同一FULLTEXT索引中的多个列。来自http://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html:
MATCH()列列表必须与表的某些FULLTEXT索引定义中的列列表完全匹配,除非此MATCH()在MyISAM表上是IN BOOLEAN MODE。对于MyISAM表,布尔模式搜索可以在非索引列上完成,尽管它们可能很慢。
在您的特定情况下,您没有完全由(tb1.comment, tb2.comment)
组成的索引 - 您也不能 - 因此匹配无法成功。
要实现此目的,请创建第三个表,该表链接到包含两个comment
字段的表,并将两列编入索引,然后在适当的JOIN
中执行匹配。