Как использовать функцию SQL с INNER JOIN в MySQL?

У меня есть функция «fnc_FindIssueId», которая принимает идентификатор объекта и возвращает свой назначенный идентификатор проблемы.

Когда я вызываю функцию, используя команды pure select, она отлично работает:

select fnc_FindIssueId(150083); // returns 1 as issueId for objectId of 150083 select fnc_FindIssueId(150072); // returns 2 as issueId for objectId of 150072 

Но когда я использую его внутри Inner Join, он переходит в бесконечный цикл:

 select so.id, si.id from smart_objects as so LEFT OUTER join smart_issues as si on si.id = fnc_FindIssueId(so.id) where so.id in (150083, 150072); 

В чем причина и как ее решить?

    Он не выполняет бесконечный цикл.

    Причина этого в том, что сервер выполняет FULL TABLE SCAN который очень медленный. Это условие si.id = fnc_FindIssueId(so.id) не использует индекс, даже если вы определили его на si.id и so.id

    Лучшие способы, которыми вы можете заняться:

    • изменить таблицу smart_objects
    • другой столбец для assigned issue Id
    • определить индекс в новом столбце

    Обходной путь состоял в том, чтобы создать новое представление с столбцами ObjectId и IssueId, а затем вызвать эту функцию изнутри этого представления! но теперь он стал очень медленным.

     CREATE ALGORITHM=UNDEFINED DEFINER=`mysql`@`%` SQL SECURITY DEFINER VIEW `vw_smart_objectissue` AS select `so`.`id` AS `objectid`,`fnc_FindIssueId`(`so`.`id`) AS `issueid` from `smart_objects` `so` order by `so`.`id`$$