2013-02-11 68 views
1

我有一个函数“fnc_FindIssueId”,它接受一个对象ID并返回其分配的问题ID。如何在MySQL中使用INNER JOIN的SQL函数?

当我使用纯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 

但是,当我的内内使用加入,它进入一个永无休止的循环:

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); 

这是什么原因以及如何解决?

+0

你的第二个例子是** OUTER **连接,而不是* INNER *连接。 – 2013-02-11 13:15:14

回答

1

它不执行永不停止循环。

原因是因为服务器执行的是非常慢的FULL TABLE SCAN。即使您已在si.idso.id上定义了一个索引,条件si.id = fnc_FindIssueId(so.id)也不会使用索引。

你能做的最好的方法是:

  • 修改表smart_objects
  • assigned issue Id
  • 另一列对新列
+0

查找问题ID的逻辑很复杂,取决于其他一些场景,这就是为什么创建了一个单独的功能。我无法更改设计,请回答问题,如果可以的话,谢谢。 – 2013-02-11 12:13:15

+0

为什么执行全表扫描?我在WHERE子句中添加了过滤器来限制它们?它应该应用过滤器,然后连接,类似于SQL Server! – 2013-02-11 12:15:07

+0

这是我能说的最好的答案。也许别人可以。我无法帮助您优化查询,因为您正在参与功能的结果。 – 2013-02-11 12:16:09

0

的解决方法是定义一个指数使用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`$$