Cómo unir o unir internamente una tabla

Tengo estos datos en una tabla, por ejemplo,

id name parent parent_id 1 add self 100 2 manage null 100 3 add 10 200 4 manage null 200 5 add 20 300 6 manage null 300 

¿Cómo puedo left join o left join inner join esta tabla, así obtengo este resultado a continuación?

 id name parent 2 manage self 4 manage 10 6 manage 20 

Como puedo, solo quiero consultar la fila con la palabra key "administrar", pero quiero que los datos de la columna parent en la fila de agregar sean los mismos que en la fila de la administración en el resultado.

¿Es posible?

EDITAR:

la versión simplificada de mi tabla real – system ,

 system_id parent_id type function_name name main_parent make_accessible sort 31 30 left main Main NULL 0 1 32 31 left page_main_add Add self 0 1 33 31 left page_main_manage Manage NULL 0 2 

mi consulta real y ya es bastante complicada …

 SELECT a.system_id, a.main_parent, b.name, b.make_accessible, b.sort FROM system AS a INNER JOIN -- self -- ( SELECT system_id, name, make_accessible, sort FROM system AS s2 LEFT JOIN -- search -- ( SELECT system_id AS parent_id FROM system AS s1 WHERE s1.function_name = 'page' ) AS s1 ON s1.parent_id = s2.parent_id WHERE s2.parent_id = s1.parent_id AND s2.system_id != s1.parent_id ORDER BY s2.sort ASC ) b ON b.system_id = a.parent_id WHERE a.function_name LIKE '%manage%' ORDER BY b.sort ASC 

resultado que recibo actualmente

 system_id main_parent name make_accessible sort 33 NULL Main 0 1 

pero estoy después de esto,

 system_id main_parent name make_accessible sort 33 self Main 0 1 

Solo necesita hacer reference a la tabla dos veces:

 select t1.id, t1.name, t2.id, t2.name from TableA t1 inner join TableA t2 on t1.parent_id = t2.Id 

Reemplace el interior con el izquierdo si desea ver las raíces en la list.

ACTUALIZAR:

Leí mal tu pregunta. Me parece que siempre tienes dos filas, administra una y agrega una. Para llegar a "Agregar" desde la administración:

 select system.*, (select parent from system s2 where s2.parent_id = system.parent_id and s2.name = 'add') AS parent from system where name = 'manage' 

O bien, puede dividir la tabla en dos tablas derivadas y unirlas mediante parent_id:

 select * from system inner join ( select * from system where name = 'add' ) s2 on system.parent_id = s2.parent_id where system.name = 'manage' 

Esto le permitirá usar todas las columnas de s2.

Sus datos no se ajustan a una estructura jerárquica padre-hijo. Por ejemplo, el parent columna tiene el valor 10 , que no es el valor de ningún id , por lo que no es posible una asociación padre-hijo.

En otras palabras, no hay nada que relacione el logging 2,manage,null el logging 1,add,self o el logging 4,manage,null a 3,add,10 , como piensa hacer en su consulta.

Para representar datos jerárquicos, generalmente necesita una tabla que tenga una key externa que haga reference a su propia key principal. Por lo tanto, el parent columna debe hacer reference al id la columna, luego puede express una relación padre-hijo entre manage y add . Actualmente, eso no es posible.

ACTUALIZADO: uniéndose por parent_id, intente:

 select m.id, m.name, a.parent from myTable m join myTable a on m.parent_id = a.parent_id and a.name = 'add' where m.name = 'manage' 

Cambia la combinación interna a una combinación izquierda si no puede haber una fila de agregar correspondiente.

    Intereting Posts