可以将 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
可以将来自两个不同表的 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