2013-02-11 60 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`$$