可以将 MATCH AGAINST 与 COALESCE 一起使用吗?

It is possible to use MATCH AGAINST with COALESCE?

可以将来自两个不同表的 COALESCE(x,y) 与一个字符串匹配吗?

这是我的请求(无效...)

SELECT COALESCE(title_translations.title,collection.title) 
LEFT JOIN title_translations ON title_translations.ref_collection=collection.id
WHERE MATCH(COALESCE(title_translations.title,collection.title)) AGAINST("string")

如果我尝试只匹配 collection.title,但不匹配两者,请求将正常工作

https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html 说:

MATCH() takes a comma-separated list that names the columns to be searched.

通过尝试使用 COALESCE(),您将字符串表达式传递给 MATCH(),而不是列标识符。

那不行。


回复您的评论:

MATCH(title_translations.title,collection.title) 无论如何都行不通,因为您列出的列必须属于单个全文索引,并且每个索引属于一个 table。您不能列出来自不同 table 的列。如果定义了多列全文索引,则还必须列出 all 定义的列。

我假设在您的情况下,您为每个 table.

中的单个列 title 定义了一个全文索引

你将需要这个:

WHERE MATCH(title_translations.title) AGAINST('string')
   OR MATCH(collection.title) AGAINST('string')

您必须在两个匹配项中执行此操作,因此您必须在每个项中重复反对。

但我不确定这是否符合您的意图。从你原来的问题中不清楚。


回复您的说明:

If the title exists in title_translations, string need to be matched against title_translations.title and only against it. If the title doesn't exist in title_translations, string need to be matched against collection.title

这是我想出的:

SELECT x.title FROM 
(
    SELECT IF(t.title IS NOT NULL,
      IF(MATCH(t.title) AGAINST('string') > 0, t.title, NULL),
      IF(MATCH(c.title) AGAINST('string') > 0, c.title, NULL)
    ) AS title
    FROM collection AS c
    LEFT OUTER JOIN title_translations AS t
      ON t.ref_collection = c.id
) AS x
WHERE x.title IS NOT NULL