У меня есть таблица, которая выглядит следующим образом:
Если есть какая-либо связь между импортированным и разделом, то они должны быть сгруппированы вместе.В зависимости от отношения они должны быть сгруппированы как 1,2,3,4, ....
Я пробовал запрос, который выглядит следующим образом:
select sec.section,sec.id, sec.imported, sec.id,
case when imp.imported = sec.section or imp.imported is null then 1 ELSE
2 end as rn
from
( select section, id, imported from temp1) sec
left outer join
(
select imported, Section from temp1
) imp on imp.imported = sec.section
Но в этом сценарии мойрн всегда 1. Можете ли вы помочь мне рассмотреть этот запрос?Я не уверен, как обойти это.Нужно ли использовать цикл while и делать это или это можно сделать с помощью запроса?
Пример сценария создания:
create table temp1 (
id int, imported int, section int, rn int, checked int default 0
);
insert into temp1(id, section, rn) values (204, 718, 0);
insert into temp1(id, imported, section, rn) values (997,718,034,0);
insert into temp1(id, imported, section, rn) values (998,034,055,0);
insert into temp1(id, imported, section, rn) values (111,453,234,0);
insert into temp1(id, section, rn) values (908, 453,0);
insert into temp1(id, imported, section, rn) values (231,234,890,0);
insert into temp1(id, section, rn) values (342, 567,0);
Мой конечный результат должен выглядеть следующим образом:
Я пытался использовать цикл while, создавая хранимую процедуру:
DROP PROCEDURE IF EXISTS sp_recursiveimport;
Delimiter $$
CREATE PROCEDURE sp_recursiveimport() -- (IN rnX integer)
BEGIN
DECLARE n INT DEFAULT 0; DECLARE i,j,k INT DEFAULT 0; SELECT COUNT(*) FROM temp1 INTO n;
SET i=0; set @rn = 1; -- set @k = 0;
WHILE i<n DO
set j = 0; select i;
set @sec = (select ifnull(section,0) FROM temp1 LIMIT i,1);
set @imp = (select ifnull(imported,0) FROM temp1 LIMIT i,1); select @imp, @sec;
update1: while j<n do select j;
-- if j=0 then
if (select ifnull(imported,0) from temp1 limit j,1) = @sec and (select checked from temp1 limit j,1) = 0 then
set @update = concat('update temp1 set rn = 1, checked = 1 where imported = ',@sec); select @update; PREPARE stmt_name FROM @update; EXECUTE Stmt_name; DEALLOCATE prepare stmt_name;
set @update1 = concat('update temp1 set rn = 1, checked = 1 where section = ',@sec); select @update1; PREPARE stmt_name FROM @update1; EXECUTE Stmt_name; DEALLOCATE prepare stmt_name;
set k = j;
end if;
if (select ifnull(section,0) from temp1 limit j,1) = @imp and (select checked from temp1 limit j,1) = 0 then
set @update3 = concat('update temp1 set rn = 1, checked = 1 where section = ',@imp); select @update3; PREPARE stmt_name FROM @update3; EXECUTE Stmt_name; DEALLOCATE prepare stmt_name;
set @update4 = concat('update temp1 set rn = 1, checked = 1 where imported = ',@imp); select @update4; PREPARE stmt_name FROM @update4; EXECUTE Stmt_name; DEALLOCATE prepare stmt_name;
set k = j;
end if;
-- set @sec = (select ifnull(imported,0) from temp1 limit k,1);
-- set @imp = (select ifnull(section,0) from temp1 limit k,1); select @sec, @imp;
set j= j+1;
end while update1;
set i = i + 1;
END WHILE;
END;
$$
delimiter;
Не знаю, почему она не работает.