根据先前的行组合值更新数据

时间:2013-09-22 16:20:57

标签: mysql sql-update

我有一个具有以下结构的MySQL表:

ID CatLevel1 CatLevel2 CatLevel3 ... CatLevel6 AcctLevel1 AcctLevel2 ... AcctLevel6 (CatLevel的6列,从1到6)和AcctLevel的6列,从1到6)。

从AcctlLevel1开始,我需要根据Catelevel字段中的值以下列方式更新它:

在CatLevel1上开始迭代。 AcctLevel1的初始值 - > 01。 如果CatLevel1 Row(n)<> CatLevel1 Row(n-1)然后是AcctLevel1 - > 02。 这意味着每次在CatLevel1中找到新值(与上一行不匹配)时,将AcctLevel1增加1,同时为小于10的值添加前导零。

当迭代CatLevel1中的最后一行时,从CatLevel2开始并以相同的方式迭代它。

我想知道要走哪条路,用小块分解它并用PHP编写代码或者在MySQL中以某种方式或递归方式完成所有工作?

很多人会认为我要求解决方案,但我真的想要一些想法让我开始,因为我对如何去做有点困惑。

1 个答案:

答案 0 :(得分:1)

根据您的要求,我会附上以下内容。

  • 第一次更新会进行必要的重置。
  • 当前一行发生更改时,第二个导致AcctLevel1为1。
  • 第三次更新总结了这些1以创建最终结果。

数据:

create table data
(
id int,
CatLevel1 varchar(5),
AcctLevel1 varchar(5)
);

insert into data values (0,'1','0');
insert into data values (1,'2','0');
insert into data values (2,'1','1');
insert into data values (3,'2','1');
insert into data values (4,'2','1');

SQL命令:

UPDATE `data` t1 SET AcctLevel1 = 0;

update `data` t1
             left outer JOIN `data` t2
             on t1.id-1 = t2.id
set t1.AcctLevel1 = 
case when t1.CatLevel1 = t2.CatLevel1 then  t1.AcctLevel1 
else  t2.AcctLevel1+1 end;

update `data` t1
set t1.AcctLevel1 =
( select SUM(TEMP.AcctLevel1) from (SELECT *FROM `data`) AS TEMP where TEMP.ID <= t1.ID );

更新:最终玩具查询

UPDATE `data` t4
SET AcctLevel1 =
  (
    SELECT CASE WHEN TEMP.SCHANGES IS NULL THEN 0 ELSE TEMP.SCHANGES END from
         (SELECT T3.ID,
           (SELECT SUM(CASE WHEN t1.CatLevel1 = t2.CatLevel1 THEN 0 ELSE 1 END) AS SUM_CHANGES
            FROM `data` t1,
                        `data` t2
            WHERE t1.id-1 = t2.id
            AND t1.ID <= t3.ID) AS SCHANGES
         FROM `DATA` t3 ) as TEMP where TEMP.ID = T4.ID
  );

最终的JSFiddle: http://sqlfiddle.com/#!2/325f16/2