选择要根据值更新的列

时间:2014-10-14 00:13:47

标签: mysql sql sql-update

我要做的是通过生成各种汇总表来减少聚合数据所需的时间。当我插入记录时,会触发插入后触发器,这将更新正确的行。如果需要,我会更新汇总表的所有列,但由于表中有25列,每个插件只更新其中的2列,我宁愿能够动态选择要更新的列。后插入触发器中的当前更新语句类似于:

update peek_at_chu.organization_data_state_log odsl
inner join  (   select
                    lookUpID as org_data_lookup,
                    i.interval_id,
                    peek_at_chu.Get_Time_Durration_In_Interval1('s', new.start_time, new.end_time, i.start_time, i.end_time) as time_in_int,
                    new.phone_state_id
                from
                    (peek_at_chu.interval_info i
                     join peek_at_chu.interval_step int_s on i.interval_step_id = int_s.interval_step_id)) as usl on odsl.org_date_lookup_id = usl.org_data_lookup
                                                                                                                 and odsl.interval_id = usl.interval_id
set
    total_seconds = total_seconds + usl.time_in_int,
    case new.phone_state_id
        when 2 then
            available_seconds = available_seconds + time_in_int
    end;

在此,lookUpID是先前在触发器中声明的变量。将指示要更新的汇总表的哪个字段为new.phone_state_id的字段。 phone_state_id不一致,即在此表中跳过了一些数字,因此除非我创建映射,否则基于列号的更新将在窗口外。

case选项会抛出错误,但如果可以的话,我希望使用与此类似的内容而不是25 if个语句。

1 个答案:

答案 0 :(得分:0)

您必须更新所有列,但使用条件来确定是为其赋予新值还是保留旧值:

set total_seconds = total_seconds + usl.time_in_int,
    available_seconds = IF(new.phone_state_id = 2, available_seconds + time_in_int, available_seconds)

对于需要有条件更新的所有其他列,重复最后一行中的模式。