我试图创建一个SELECT查询,它通过LEFT JOIN
合并3个表,然后MATCH
特定关键字AGAINST
生成的表。使用两个LEFT JOIN,MATCH AGAINST和FULLTEXT索引创建有效的MySQL查询
到目前为止,我的测试表明查询工作正常,输出结果正确,但是当通过LEFT JOIN
连接表时,我对FULLTEXT索引有疑问。
问题是 - 我应该添加额外的代码来反映MATCH AGAINST
在执行LEFT JOIN
时的FULLTEXT
索引要求,或者只有原始表中相关列的正确索引足够了吗?
询问的原因是this post。如果我理解它正确,我的代码不应该工作(因为“你无法在MySQL中的多个表中定义全文索引...”)。因为它们没有索引(或本我如何理解它,纠正我,如果我错了:))因此MATCH AGAINST
为ma.name_url
和v.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
所以,我已经正确定义的索引和全文索引在'MATCH AGAINST'是罚款中使用的列的事实呢?例如,如果我在'tbl_names'的'name_url'上没有'FULLTEXT'索引会怎么样?看起来这不影响输出?另外,是的,我首先加入所有的'ma'行,然后我执行一个'MATCH'来查找哪些行符合条件。 – user3132858
@ user3132858。 。 。布尔搜索不需要FULLTEXT,尽管它慢得多。我的观点是,所有的过滤都可以在'v'上,而不是在'ma'上,所以你将有'ma'行都不符合条件。 –
感谢您的帮助......所以基本上你是说如果我有一个关键字只匹配一个'ma'行,该行将不会在查询结果中?我试过了,只搜索一个包含在'ma'中的一个关键字,结果如预期的那样... – user3132858