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字段,不变更此条记录的批次号,在新生成数据的记录中写入原数据的批次号
这样对于统计某条记录的变化次数和变更履历就很方便了。当然,这是在可以新增字段的前提下。