1

我有一个具有以下结构的 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 中以某种排序或递归方式完成所有工作?

你们中的许多人会认为我在寻求解决方案,但我真的在寻求一些想法让我开始,因为我对如何去有点困惑。

4

1 回答 1

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

于 2013-09-22T16:29:15.720 回答