2016-03-17 30 views
3

我已經搜索了有關如何在嘗試更新多連接表中的字段時使用同一個多連接的最短日期tableset。MySQL無法在FROM多個表連接中指定目標表進行更新

這是我的更新語句:

update vtiger_projectmilestone 
Inner Join vtiger_projectmilestonecf ON vtiger_projectmilestone.projectmilestoneid = vtiger_projectmilestonecf.projectmilestoneid 
Inner Join vtiger_crmentity ON vtiger_projectmilestone.projectmilestoneid = vtcrmm.crmid 
inner join vtiger_project on vtiger_project.projectid = vtiger_projectmilestone.projectid 
Inner Join vtiger_crmentity vtcrmp ON vtcrmp.crmid = vtiger_project.projectid 

set vtiger_projectmilestone.projectmilestonedate = 
(select min(vtiger_projecttaskcf.cf_779) 
FROM vtiger_projecttask tvpt 
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid = tvptcf.projecttaskid 
Inner Join vtiger_projectmilestone tvpm ON tvpm.projectmilestoneid = tvpt.projecttasknumber 
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpmcf.projectmilestoneid 
Inner Join vtiger_crmentity AS vtcrmm ON tvpm.projectmilestoneid = vtcrmm.crmid 
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid 
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no 
) 
where vtiger_projectmilestone.projectid = 
(select vtiger_project.projectid from vtiger_project 
INNER JOIN vtiger_crmentity vtcrmp ON vtiger_project.projectid = vtcrmp.crmid 
where vtcrmp.deleted = 0 order by vtiger_project.projectid desc limit 1) 
and vtcrmp.deleted = 0 
and vtcrmm.deleted = 0 
and (vtiger_projectmilestone.projectmilestonedate is null or  vtiger_projectmilestonecf.cf_763 is null) ; 

這是一個現實生活中的更新查詢,不只是一個簡單的表格關係。

我通過創建臨時表,插入值,更新目標表和刪除臨時表來得到它。

我真的想得到這個權利,因爲它會更頻繁地出現。

所有協助表示讚賞。

乾杯 伯納德·貝利

回答

0

正如this answer說你不能使用目標更新表中的子查詢,你可以在你的查詢看到

SELECT min(vtiger_projecttaskcf.cf_779) 
FROM vtiger_projecttask tvpt 
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid = tvptcf.projecttaskid 
Inner Join 
--using target update table in query 
vtiger_projectmilestone tvpm ON tvpm.projectmilestoneid = tvpt.projecttasknumber 
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpmcf.projectmilestoneid 
Inner Join vtiger_crmentity AS vtcrmm ON tvpm.projectmilestoneid = vtcrmm.crmid 
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid 
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no 

但是我認爲一個解決辦法使用從表中您要更新,所以不是使用連接數據,你可以寫一些地方,例如條件:

SELECT min(vtiger_projecttaskcf.cf_779) 
FROM vtiger_projecttask tvpt 
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid = tvptcf.projecttaskid 
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpt.projecttasknumber 
Inner Join vtiger_crmentity AS vtcrmm ON tvpt.projecttasknumber = vtcrmm.crmid 
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid 
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no 
--using the projectmilestoneid in a where clause 
AND tvpt.projecttasknumber=vtiger_projectmilestone.projectmilestoneid 

警告可能是,你可能會得到一些性能問題,也因爲我不知道完整的模式,我不能告訴如果在子查詢中使用其他表而不是vtiger_projectmilestone會給你正確的結果

相關問題