Recibe las "cadenas" largos y más cortos en MySQL?

gelatina jey:

Considere este esquema:

create table Operation(id integer, name varchar(100));
create table Pipeline(operation_in integer, operation_out integer);

Pipelinetiene las claves externas a Operations, por lo que las tuberías están encadenados, en cierto modo. operation_outes anulable. ¿Cómo consigo los nombres de las operaciones, tanto en las más largas y más cortas cadenas de tuberías usando MySQL?

Las operaciones se ven así:

INSERT INTO Operation VALUES (1, 'operation one');

Mientras que las tuberías tienen el siguiente aspecto:

INSERT INTO Pipeline VALUES (1, 2);
INSERT INTO Pipeline VALUES (2, 4);
INSERT INTO Pipeline VALUES (4, 7);
INSERT INTO Pipeline VALUES (7, NULL);

Es decir, la cadena de aquí sería operaciones con el ID 1, 2, 4, 7 y resultado esperado a lo largo de las líneas de:

"operation one", "operation two", "operation four"...

Después de unas pocas horas de investigación, no estoy muy seguro de cuál es la solución que estoy buscando.

Cualquier versión de MySQL es aplicable.

El Empalador :

En MySQL 8.x puede utilizar un CTE recursiva para encontrar las cadenas que necesita.

Por ejemplo:

with recursive
a as (
  select
    p.operation_in,
    p.operation_out as current_out,
    o.name as op_names,
    concat('', p.operation_in) as chain,
    1 as size
  from pipeline p
  join operation o on o.id = p.operation_in
  where not exists (
    select 1 from pipeline p2 where p2.operation_out = p.operation_in
  )
  union all
  select
    a.operation_in,
    p.operation_out,
    concat(op_names, ', ', o.name),
    concat(chain, ',', p.operation_in),
    size + 1
  from a
  join pipeline p on p.operation_in = a.current_out
  join operation o on o.id = p.operation_in
),
chains as (
  select * from a where current_out is null
)
select op_names, chain, size
from chains
where size = (select max(size) from chains)  -- finds the longest one
   or size = (select min(size) from chains); -- finds the shortest one

Resultado:

op_names                           chain    size
---------------------------------  -------  ----
op-nine, op-six                    9,6         2
op-one, op-two, op-four, op-seven  1,2,4,7     4

El guión de datos que utiliza es:

create table operation (id integer, name varchar(100));
create table pipeline (operation_in integer, operation_out integer);

insert into operation values (1, 'op-one');
insert into operation values (2, 'op-two');
insert into operation values (4, 'op-four');
insert into operation values (6, 'op-six');
insert into operation values (7, 'op-seven');
insert into operation values (9, 'op-nine');

insert into pipeline values (1, 2);
insert into pipeline values (2, 4);
insert into pipeline values (4, 7);
insert into pipeline values (7, null);
insert into pipeline values (9, 6);
insert into pipeline values (6, null);

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=320759&siteId=1
Recomendado
Clasificación