【问题标题】:MySQL multiple tables full text searchMySQL多表全文搜索
【发布时间】:2018-01-05 22:12:31
【问题描述】:

在我当前的项目中,我有如下表格。

Customer table          Task table
+----+----------------+ +----+--------------+-------------+
| id | name           | | id | description  | customer_id |
+----+----------------+ +----+--------------+-------------+
| 1  | teste client 1 | | 1  | do something | 1           |
+----+----------------+ +----+--------------+-------------+
| 2  | teste client 2 | | 2  | anything     | 2           |
+----+----------------+ +----+--------------+-------------+

我想使用一些用户关键字按任务description 和客户name 进行搜索。

select * 
from task t
inner join customer c on t.customer_id = c.id  
where match(t.description, c.name) 
against ('+test*+some*' IN BOOLEAN MODE);

使用前面的查询我得到以下错误Error Code: 1210. Incorrect arguments to MATCH,我知道我不能在同一个匹配中使用来自不同表的字段。

但是如何使用多个匹配项获得与上一个查询完全相同的结果?

(如果有人有或知道关于这类问题的好文章,请告诉我)

更新

按照所提供的查询和数据的一些预期结果:

  • 当我通过testsome搜索时,结果应该只有teste client 1
  • 当我通过testclient 搜索时,结果应该是teste client 1teste client 2
  • 当我按any 搜索时,结果应该是teste client 2

如果我们只有一张表同时包含namedescription,您可以在SQLFiddle 中查看预期结果。

【问题讨论】:

  • 在哪里可以找到问题的解决方案或仍在寻找合适的查询?
  • 不,我没有找到任何解决这个问题的方法。
  • 我认为您想要的结果表是互斥的:搜索 test and some 时,您匹配两个表,因此只返回 test client 1。但是,当您在 Tasks 表中搜索 test and client 时,没有一个 customer_id 匹配,但您仍然说应该返回 teste client 1teste client 2。我认为这在逻辑上是不正确的。为什么要在第二种情况下省略第二个表匹配,而在第一种情况下需要它?在我的回答中使用我的尝试检查指向 SQLFiddle 的链接。
  • 嗯,是的,我明白你的意思,但是在没有namedescription 两列的单独表格的情况下,有没有办法做到这一点?为搜索关键字设置单独的表格的问题是我必须维护重复的信息。您可以检查我使用您创建的更新 SQLFiddle。
  • FTS-ed 列在 2 个表中拆分是没有问题的。正如你从我的小提琴中看到的,我们可以有效地将它们与JOIN 结合起来。问题是您的条件是否只需要一个表匹配或两者都不确定。如果您创建一个一致的匹配要求,我认为我们将能够创建一个查询来选择正确的结果,即使列拆分为 2 个表。我们只需要确切地知道什么时候只需要第一个表匹配,只需要第二个表匹配,两个表匹配或至少一个表匹配。顺便说一句,我看不到你在 Fiddle 中的变化。请添加链接。

标签: mysql full-text-search


【解决方案1】:

更新的解决方案SQLFiddle

set @q = 'test* some*';

select * from 
(
    select
        c.id,
        c.name,
        match(c.name) against (@q IN BOOLEAN MODE) as t1_match,
        match(t.description) against (@q IN BOOLEAN MODE) as t2_match
    from task t
    inner join customer c on t.customer_id = c.id  
) as s
where s.t1_match > 0 OR s.t2_match > 0 

目前,我认为您想要的结果逻辑是相互排斥的。请参阅我上面的评论。

【讨论】:

  • 1º 选项不会返回相同的结果,因为 testsome 不需要在两个字段中都存在。 2º 选项我得到完全相同的错误Error Code: 1210. Incorrect arguments to MATCH
  • @FxmL 然后在第一个查询中将AND 之间的MATCH-es 更改为OR。查看更新的答案。
  • 如果我使用AND 而不是OR 我得到的效果与我只使用一个MATCH 不同
  • @FxmL 不不,你应该试试OR,原来有AND,我现在改成了OR
  • 我已经尝试了这两种结果与只使用一个match 不同,因为如果我使用两个单词testsome 进行查询,如果我使用@987654338 @ 所有带有testsome 的行都会出现。当我想要获取带有testsome 的行时。另一方面,如果我使用AND 并且如果这两个单词仅属于一个表,它将返回零行。
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 2010-11-10
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多