2015-09-26 150 views
0

我试图创建一个SELECT查询,它通过LEFT JOIN合并3个表,然后MATCH特定关键字AGAINST生成的表。使用两个LEFT JOIN,MATCH AGAINST和FULLTEXT索引创建有效的MySQL查询

到目前为止,我的测试表明查询工作正常,输出结果正确,但是当通过LEFT JOIN连接表时,我对FULLTEXT索引有疑问。

问题是 - 我应该添加额外的代码来反映MATCH AGAINST在执行LEFT JOIN时的FULLTEXT索引要求,或者只有原始表中相关列的正确索引足够了吗?

询问的原因是this post。如果我理解它正确,我的代码不应该工作(因为“你无法在MySQL中的多个表中定义全文索引...”)。因为它们没有索引(或本我如何理解它,纠正我,如果我错了:))因此MATCH AGAINSTma.name_urlv.model,是行不通的。

然而,作为查询输出似乎是正确的,我需要的专家建议,如果下面的代码是正确的,或者我应该添加/修改的东西:

SELECT v.*, vt.color, ma.* 
      FROM tbl_items AS v 
    LEFT JOIN tbl_options 
      AS vt on v.id = vt.v_id 
    LEFT JOIN tbl_names 
      AS ma on v.make = ma.id 
     WHERE 
       ( 
         ( 
        MATCH (ma.name_url) AGAINST ('keyword1' IN BOOLEAN MODE) 
       OR MATCH (v.model) AGAINST ('keyword1' IN BOOLEAN MODE) 
        ) 
      AND 
         ( 
        MATCH (ma.name_url) AGAINST ('keyword2' IN BOOLEAN MODE) 
       OR MATCH (v.model) AGAINST ('keyword2' IN BOOLEAN MODE) 
        ) 
       ) 
      AND v.type = 4 

回答

0

我认为你是误读职务。 A single仅供全文索引参考一张表。其实所有其他指标都是如此,所以我不确定为什么会出现混乱。索引可以引用表中的多个列,但仅限于一个表。

至于你的查询,我不确定哪个更重要 - 全文索引或常规索引。

由于编写查询,您要退回不符合match条件ma行。也许这很好,但看起来很可疑。

而且,如果性能是一个问题,你可能会发现,打破了查询到单独的子查询(由UNIONUNION ALL连接)提供更好的性能。每个子查询可以更高效地进行优化。

+0

所以,我已经正确定义的索引和全文索引在'MATCH AGAINST'是罚款中使用的列的事实呢?例如,如果我在'tbl_names'的'name_url'上没有'FULLTEXT'索引会怎么样?看起来这不影响输出?另外,是的,我首先加入所有的'ma'行,然后我执行一个'MATCH'来查找哪些行符合条件。 – user3132858

+0

@ user3132858。 。 。布尔搜索不需要FULLTEXT,尽管它慢得多。我的观点是,所有的过滤都可以在'v'上,而不是在'ma'上,所以你将有'ma'行都不符合条件。 –

+0

感谢您的帮助......所以基本上你是说如果我有一个关键字只匹配一个'ma'行,该行将不会在查询结果中?我试过了,只搜索一个包含在'ma'中的一个关键字,结果如预期的那样... – user3132858