sql查询结果作为条件循环

img


已知有T表,该表有t1 ,t2 两个字段 ,t1字段的数据(A)通过页面程序发生变化,会将变化的数据(A1)存到该条数据下的t2字段内,同时会生成一条t1字段为(A1),t2字段为null的数据,如数据继续发生变化,则t1字段为A1的数据 t2字段null变为A2,同时继续生成一条T1为A2 t2为null的数据 。提问 在不知道该数据发生几次变化的情况下 求出该条数据变化了几次,并查出所有变化过的数据(例如 A发生五次变化 最后求出A1-A5) 该表为动态表 数据一直在变化。

create table test_20220513(
 parent_id varchar(20),
  id varchar(20)
);


INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('A','A1');
INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('A1','A2');
INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('A2','A3');
INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('A3','null');
INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('B', 'B1');
INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('B1','B2');
INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('B2','B3');
INSERT INTO test_20220513 (`parent_id`,`id` ) VALUES ('B3','null');



SELECT
        t3.id,
        t3.child 
    FROM
        (
        SELECT
            id,
        IF
            ( find_in_set( t1.PARENT_ID, @p ) > 0, @p := concat( @p, ',', id ), 0 ) AS child 
        FROM
            ( SELECT id, PARENT_ID FROM test_20220513 t ORDER BY id ) t1,
            ( SELECT @p := 'A' ) t2 
        ) t3 
    WHERE
    t3.child != '0'

这个要看你的数据库是什么,以及版本号是多少。
现在很多数据库都支持with递归查询,不需要写循环,你可以先用 "with 递归 sql"作为关键词搜索一下相关文章,如果不会的话再问,或者看我之前的一些回答

然后下面这个页面有大量的sql问答,就是数据量太大,加载有点慢,等加载完后可以按单个关键词在页面中搜索相关sql

in条件子查询。将子查询的结果作为查询条件。

简单说下设计思想:
1.再新增一个字段用以辅助,类似于批次号
2.每次更新数据的时候,变化的数据1更新到t2字段,不变更此条记录的批次号,在新生成数据的记录中写入原数据的批次号
这样对于统计某条记录的变化次数和变更履历就很方便了。当然,这是在可以新增字段的前提下。