Попытка написать хранимую функцию для использования в операторе mysql UPDATE SET - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть две таблицы TABLE-2 и TABLE_3

  • TABLE-2
Preferred_Name|name_TABLE_3
---------------------------
Pref_Name1    |
Pref_Name2    |
Pref_Name3    |
...etc
  • TABLE_3
name
-----
name1
name2
name3
...etc

Я пытаюсь использовать MATCH (имя) AGAINST ('Preferred_Name') для обновления таблицы TABLE-2 с именем наилучшего совпадения из TABLE_3, например:

SELECT name, MATCH (name) ПРОТИВ ('Preferred_Name') как релевантность ОТ TABLE_3 ГДЕ МАТЧ (name) ПРОТИВ ('Preferred_Name'), имеющий релевантность = max (MATCH (name) AGAINST ('Preferred_Name'))

Но так как AGAINST не принимает переменные, я попытался сделать это через хранимую функцию. Я пытаюсь написать хранимую функцию в phpmyadmin для использования в операторе UPDATE SET:

UPDATE `TABLE-2` SET `TABLE-2`.`name_TABLE_3` = best_fulltext_match(`TABLE-2`.`Preferred_Name`);

внутренний код:

SELECT name, MATCH (name) ПРОТИВ ('Preferred_Name') в качестве релевантности FROM TABLE_3 WHERE MATCH (name) AGAINST ('Preferred_Name'), имеющей отношение= max (MATCH (name) AGAINST ('Preferred_Name')))

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

CREATE DEFINER=`root`@`localhost` FUNCTION `best_fulltext_match`(`search_string` TEXT) RETURNS varchar(600) CHARSET latin1
DETERMINISTIC
BEGIN
RETURN (SELECT `name`, MATCH (`name`) AGAINST ('search_string') as relevance FROM `TABLE_3` WHERE MATCH (`name`) AGAINST ('search_string') having relevance=max(MATCH (`name`) AGAINST ('search_string'))); 
END

1 Ответ

0 голосов
/ 25 сентября 2019

Функции MySQL возвращают только одно значение, поэтому вместо того, чтобы возвращать целую таблицу из функции, вы должны использовать хранимую процедуру.

CREATE PROCEDURE `best_fulltext_match`(`search_string` IN TEXT)
CHARSET latin1
BEGIN
        SELECT `name`, MATCH (`name`) AGAINST (`search_string`) as relevance
        FROM `TABLE_3`
        WHERE MATCH (`name`) AGAINST (`search_string`)
        GROUP BY `name`
        HAVING relevance=max(MATCH (`name`) AGAINST (`search_string`))); 
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...