4

我有以下查询,它针对 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.comment 上执行 MATCH,它工作正常,我会取回相关的搜索词,但我想对两列都执行它。

但是,因为另一个表是可选的 LEFT JOIN,如果没有匹配的 Id,它不会返回任何内容。关于如何克服这个问题的任何想法?

4

2 回答 2

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
于 2013-09-06T21:15:59.650 回答
2

您无法匹配不在同一个 FULLTEXT 索引中的多个列。来自http://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html

MATCH() 列列表必须与表的某些 FULLTEXT 索引定义中的列列表完全匹配,除非此 MATCH() 在 MyISAM 表上处于布尔模式。对于 MyISAM 表,可以在非索引列上进行布尔模式搜索,尽管它们可能很慢。

在您的特定情况下,您没有完全包含的索引 - 你也不能(tb1.comment, tb2.comment)- 所以匹配永远不会成功。

要使其正常工作,请创建第三个表,该表链接到包含两个comment字段的那些表,两个列都已编入索引,并在适当的JOIN.

于 2013-09-06T20:50:51.370 回答