mysql5怎么能做同样的事情,就像oracle连接由一个字段的优先顺序兄弟姐妹?



有很多方法可以在mysql5上做预先连接,(我知道mysql8支持这个查询,但是,我使用的是mysql5),我早就知道我可以使用find_in_set来实现连接,但我怎么能像神谕那样实现兄弟姐妹的顺序呢?例如,这是测试数据E,我的实际数据是,id是guid就像

62CF6FFEDE064B00ADFF43ED0E6EFDDB
create table test(id varchar(10),ordernumber decimal,pid varchar(10));
insert into test values('62CF6',2,'');
insert into test values('44DF8',3,'D13A3');
insert into test values('DD43F',5,'62CF6');
insert into test values('E7832',2,'53FAA');
insert into test values('48728',4,'D13A3');
insert into test values('53FAA',4,'62CF6');
insert into test values('9038A',1,'53FAA');
insert into test values('F5C7E',2,'D13A3');
insert into test values('D13A3',1,'');

在oracle中可以使用

starts with pid is null connect by prior id=pid order siblings by ordernumber asd

得到这个结果

id     ordernumber  pid
D13A3     1    
F5C7E     2         D13A3
44DF8     3         D13A3
48728     4         D13A3
62CF6     2
53FAA     4         62CF6
9038A     1         53FAA
E7832     2         53FAA
DD43F     5         62CF6

由于级别未知,我只能使用类似的程序只是示例代码,不能真正运行。

create procedure test_p(in p varchar(100))
begin
declare aa varchar;
declare unit_cur cursor for select id from table where pid=p;
open unit_cur
fetch unit_cur into aa
call test_p(aa);

那么,如果我有数百万个表要处理,我怎么能只做一个过程来处理类似的事情呢?

SELECT *
FROM test
ORDER BY CASE WHEN pid = '' 
THEN id 
ELSE pid 
END, 
ordernumber;

我已经更改了数据,我的真实id是guid - JokerSora

SELECT t1.*
FROM test t1
LEFT JOIN test t2 ON t1.pid = t2.id
ORDER BY CASE WHEN t1.pid = ''
THEN t1.ordernumber 
ELSE t2.ordernumber 
END, 
t1.ordernumber;

https://dbfiddle.uk/?rdbms=mysql_8.0&小提琴= e3c01067da653f7ae5ce5c969d0bd57f

最新更新