我正在使用两个更新查询,其中在第一次更新查询中我设置一个记录的nav order = 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 :(得分: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>
答案 1 :(得分: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的观点,即两个现有的单独查询更可取。