2010-02-27 28 views
6

Tengo una tabla con relación padre-hijo que quiero ayudar en la consulta recursivadatos jerárquicos en MySQL

Estructura de tabla

roleId, roleName,  parentId 
1  Admin   0 
2  Backup Admin 1 
3  Office User 1 0 
4  User 1   3 
5  User 2   3 
6  Office User 2 0 
7  Off User 1  6 

que estoy tratando de hacer consulta recursiva pero no soy capaz de hacer por favor sugiérame cómo debo consultar la base de datos por ejemplo

Admin 
    -- Backup Admin 
    Office User 1 
    -- User 1 
    -- User 2 
    Office User 2 
    -- Off User 1 

Respuesta

2

Como se ha señalado anteriormente esto no es realmente recursivo pero si usted sabe cuántos pasos profunda tiene que ir como máximo, se puede usar algo a lo largo de estas líneas (quizás usar PHP para generar la consulta):

Primero establecí el ID padre en NULL en lugar de 0, pero eso es preferencia personal.

SELECT * FROM table t1 
LEFT JOIN table t2 ON t2.parent_id = t1.role_id 
LEFT JOIN table t3 ON t3.parent_id = t2.role_id 
WHERE t1.parent_id IS NULL 

^^ sin importar qué tan profundo necesite ir en ese caso.

[siguiente bit no es estrictamente relevante]

A continuación, puede manipular la salida de algo a lo largo de estas líneas:

SELECT 
     (CASE 
     WHEN (t1.name IS NULL AND t2.name IS NULL) THEN t3.name 
     WHEN (t1.name IS NULL AND t2.name IS NOT NULL) THEN t2.name 
     ELSE t1.name END) AS first, 
     (CASE 
     WHEN (t1.name IS NOT NULL AND t2.name IS NOT NULL) THEN t2.name 
     WHEN (t2.name IS NULL AND t3.name IS NOT NULL) THEN NULL 
     ELSE t3.name END) AS second, 
     (CASE 
     WHEN (t1.name IS NOT NULL) THEN t3.name 
     ELSE NULL END) AS third 
FROM 
+0

Editar: En la segunda parte, probablemente, no es relevante para su problema, esto sólo asigna el valor "más profundo" a la "primera" columna. –

1

MySQL directamente no admite consultas recursivas.

Deberá emularlo escribiendo una función que mantenga la pila de recursión en una variable de sesión.

Lee este artículo en mi blog acerca de cómo hacer esto:

2

consulta la tabla una vez, lograr que todos los nombres e ID, y luego construir el árbol en cualquier lenguaje de programación que estás usando

Cuestiones relacionadas