Можно ли использовать MATCH AGAINST с COALESCE? - PullRequest
1 голос
/ 23 января 2020

Можно сопоставить 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, но не с обоими

1 Ответ

0 голосов
/ 23 января 2020

https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html говорит:

MATCH () принимает список через запятую, в котором указаны столбцы для поиска.

By пытаясь использовать COALESCE (), вы передаете строковое выражение в MATCH (), а не идентификаторы столбца.

Это не сработает.


Повторный комментарий:

MATCH(title_translations.title,collection.title) не будет работать в любом случае, потому что перечисленные вами столбцы должны принадлежать одному полнотекстовому индексу, а каждый индекс принадлежит одной таблице. Вы не можете перечислить столбцы из разных таблиц. Также вы должны перечислить все определенные столбцы, если вы определили полнотекстовый индекс из нескольких столбцов.

Полагаю, в вашем случае у вас есть один полнотекстовый индекс, определенный для одного столбца title в каждой таблице.

Вам понадобится:

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

Вы Вы должны сделать это в двух подходящих терминах, поэтому вы должны повторять ПРОТИВ каждого термина.

Но я не уверен, что это соответствует вашим намерениям. Это не ясно из вашего исходного вопроса.


Повторное разъяснение:

Если заголовок существует в title_translations, строка должна быть сопоставлена ​​с title_translations.title и только против этого. Если заголовок не существует в title_translations, необходимо сопоставить строку с 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
...