2014-01-20 122 views
0

我正在使用两个更新查询,其中第一次更新查询我设置记录的导航顺序= 0然后在另一个查询我递减导航顺序1以适当的顺序具有导航顺序,我怎么能执行这两个这个只有一个更新查询操作?任何帮助,将不胜感激。我怎样才能更新记录?

<cfif _q.is_nav_item EQ 1 AND arguments.is_nav_item EQ 0> 
    <cfquery datasource="#getDSN()#"> 
     UPDATE content 
     SET nav_order = 0 
     WHERE id = <cfqueryparam value="#arguments.id#" cfsqltype="cf_sql_integer" /> 
     AND site__id = <cfqueryparam value="#arguments.site__id#" /> 
     ; 
     UPDATE content 
     SET nav_order = nav_order - 1 
      WHERE nav_order > <cfqueryparam value="#_q.nav_order#" cfsqltype="cf_sql_tinyint" /> 
     AND site__id = <cfqueryparam value="#arguments.site__id#" /> 
        ; 
     </cfquery>    
    </cfif> 
+0

你为什么要使用一个更新查询做既是可读?您当前的代码有效并且非常易读。只需使用交易。 – Henry

+0

@Henry - 绝对可以正常工作.....但是我的TL想让它在一个查询中完成......我不知道是什么让他思考它。 –

+0

如果你要做这样的改变,应该有一个很好的理由。看起来不太可能产生任何性能优势,更重要的是,查询将更难理解。那么在这里有什么好处? – Leigh

回答

3

可以使用的情况下,结构,我认为是一样的两个查询

<cfquery datasource="#getDSN()#"> 
UPDATE content 
SET nav_order = case 
when id = <cfqueryparam value="#arguments.id#" cfsqltype="cf_sql_integer" /> then 0 
when nav_order > <cfqueryparam value="#_q.nav_order#" cfsqltype="cf_sql_tinyint" /> 
then nav_order - 1 
else nav_order 
end 

WHERE site__id = <cfqueryparam value="#arguments.site__id#" /> 
</cfquery> 
0

试试这个:

<cfif _q.is_nav_item EQ 1 AND arguments.is_nav_item EQ 0> 
    <cfquery datasource="#getDSN()#"> 
     UPDATE content 
     SET nav_order = IF(id = <cfqueryparam value="#arguments.id#" cfsqltype="cf_sql_integer" />, 0, IF(nav_order > <cfqueryparam value="#_q.nav_order#" cfsqltype="cf_sql_tinyint" />, nav_order - 1, nav_order)) 
     WHERE site__id = <cfqueryparam value="#arguments.site__id#" /> 
    </cfquery>   
</cfif> 

为了记录在案,我@Henry同意,现有的两个,单独的查询是理想的。