2017-02-13 41 views
1

我在表上使用全文搜索,并将它与来自不同数据库的表连接在一起。 表(table1)在列name上定义了全文索引。MySQL全文搜索不能使用左连接

,当我尝试使用全文搜索以下查询不起作用:

SELECT t1.id, t2.id, t2.url 
FROM `db1`.table1 t1 
LEFT JOIN `db2`.table2 t2 
ON t1.column1 = t2.column1 
WHERE t2.column1 IS NOT NULL 
AND MATCH (t1.name) AGAINST ('searchString' IN NATURAL LANGUAGE MODE) 

但使用它,而不左侧时加入了查询工作:

SELECT t1.id 
FROM `db1`.table1 t1 
WHERE MATCH (t1.name) AGAINST ('searchString' IN NATURAL LANGUAGE MODE) 

注:我不能使用LIKE %searchString% ,而不是match-against的性能问题。

有没有在同一个查询中使用全文搜索和左连接的方法?

编辑:它似乎是某种程度上与两个表不在同一个数据库的事实有关。当试图用相同的数据库中的两个表执行相同的查询时,它可以工作。任何想法为什么这可能发生?

+0

如果删除t2.column1 IS NOT NULL,会发生什么情况。 – jarlh

+0

可以在这里添加示例数据 –

+0

在删除IS NOT NULL时仍不起作用。 没有得到任何错误,查询只是卡住了。 – AnatPort

回答

0

是的我们可以使用全文搜索和左连接查询。

检查示例和查询。 :Link

 SELECT t1.id, t2.id, t2.url 
     FROM `db1`.table1 t1 
     LEFT JOIN `db2`.table2 t2 
     ON t1.column1 = t2.column1 and t2.column1 IS NOT NULL 
     where MATCH (t1.name) AGAINST ('searchString' IN NATURAL LANGUAGE MODE) 

请让我们知道,如果有任何错误。

+0

谢谢你的例子!似乎这个问题在某种程度上与两个表不在同一个数据库中的事实有关。该查询不适用于来自不同dbs的两个故事,但当尝试使用来自同一个db的两个表执行相同的查询时,它可以工作。 任何想法为什么会发生这种情况? – AnatPort

+0

我认为这可能不会发生。我在这里用虚拟数据库进行了检查。有用。 - 到达我@ sujayb7 @ gmail –

0
MATCH(t1.name) AGAINST ('searchString' IN BOOLEAN MODE)>0 
+0

谢谢,但这并不能解决问题。 – AnatPort

0

FYI where t2.column1 is not null将左连接变为连接。 左连接是来自第一个表的所有数据,但是当您在右表(第二个)上指定where子句时,则强制查询进入连接。这可能是查询不起作用的原因。第二个(右)表中没有匹配的数据。