我有一个具有以下结构的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中以某种方式或递归方式完成所有工作?
很多人会认为我要求解决方案,但我真的想要一些想法让我开始,因为我对如何去做有点困惑。答案 0 :(得分:1)
根据您的要求,我会附上以下内容。
AcctLevel1
为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