Mysql Innodb, recuperando las filas principales y sus hijos para representarlas en una ul

Tengo la siguiente estructura de base de datos:

Tenga en cuenta que el campo fk_parent_group_id puede ser NULL para grupos raíz o ser la identificación de un grupo raíz. Los grupos con fk_parent_group_id que NO es NULL no pueden tener grupos secundarios.

Estoy tratando de representar los datos de la siguiente manera:

16  Module 1    0   5       1
19  Submodule 1 0       16  1
20  Submodule 2 0       16  1
22  Submodule 3 0       16  1
24  Module 2    0           1
25  Module 3    0           1
26  Submodule 4 0       25  1
27  Submodule 5 0       25  1
28  Submodule 6 0       25  1
29  Module 4    0           1
30  Module 5    1           1
31  Module 6    0           1

Coincidentemente, los datos se ingresaron de la manera correcta en la que quiero que se emitan, me gustaría generar el formato para un widget de estilo de acordeón de JavaScript, en una serie de listas desordenadas:

    Módulo 1
    • Submódulo 1
    • Submódulo 2
    • Submódulo 3
    ...

Efectivamente, me gustaría seleccionar un grupo raíz seguido de sus grupos secundarios.

Lo siento si he puesto demasiada información aquí, he intentado unirme pero no puedo hacer que funcione en absoluto.

preguntado el 22 de mayo de 12 a las 15:05

Recomendaría dos tablas, una para módulos y otra para submódulos. De esa manera, sus consultas serían mucho más fáciles de escribir y mantener. -

Desafortunadamente, esta no es una solución viable, otras partes del sistema ya se han escrito en función de una única clave principal. -

¿Sería posible agregar una columna que identifique un módulo como padre o hijo? Si puedes hacer eso, entonces la solución es simple. -

Posiblemente, actualmente los padres se identifican por tener fk_parent_group_id ES NULO, mientras que los hijos son fk_parent_group_id NO ES NULO -

Si ese es el caso, entonces debería poder: SELECCIONAR * DEL grupo DONDE fk_parent_group_id ES NULL; itere a través de sus resultados haciendo SELECT * FROM group WHERE fk_parent_group_id= ; Construye tus objetos sobre la marcha. -

2 Respuestas

SELECT * FROM group ORDER BY CONCAT_WS('_', fk_parent_group_id, id)

contestado el 22 de mayo de 12 a las 15:05

@SpabbyPHP: en realidad, pensándolo bien, esto sería mucho más rápido (ya que no hay que perder el tiempo con las cadenas): ORDER BY IFNULL(fk_parent_group_id, id), IF(fk_parent_group_id IS NULL, NULL, id). - huevo

No estoy seguro de si esto es lo que quieres, házmelo saber:

Creo una tabla con los campos importantes (id, módulo, hijo del módulo) y la completé con algunos datos tontos y esto es lo que tengo.

mysql> show create table groups\G
*************************** 1. row ***************************
       Table: groups
Create Table: CREATE TABLE `groups` (
  `id` int(11) DEFAULT NULL,
  `modu` varchar(200) DEFAULT NULL,
  `sub_group` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> insert into groups (id,modu,sub_group) values (16,'Module 1',null),
    -> (19,'Submodule 1' ,16),
    -> (20,'Submodule 2' , 16),
    -> (22,'Submodule 3' , 16),
    -> (24,'Module 2',null),
    -> (25,'Module 3',null),
    -> (26,'Submodule 4', 25),
    -> (27,'Submodule 5', 25),
    -> (28,'Submodule 6', 25);
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> select * from groups;
+------+-------------+-----------+
| id   | modu        | sub_group |
+------+-------------+-----------+
|   16 | Module 1    |      NULL |
|   19 | Submodule 1 |        16 |
|   20 | Submodule 2 |        16 |
|   22 | Submodule 3 |        16 |
|   24 | Module 2    |      NULL |
|   25 | Module 3    |      NULL |
|   26 | Submodule 4 |        25 |
|   27 | Submodule 5 |        25 |
|   28 | Submodule 6 |        25 |
+------+-------------+-----------+
9 rows in set (0.00 sec)

Y lo importante es que la consulta apliqué una "autounión" y se ve así:

mysql> select * from groups as t1 join groups as t2  on t1.id=t2.sub_group;
+------+----------+-----------+------+-------------+-----------+
| id   | modu     | sub_group | id   | modu        | sub_group |
+------+----------+-----------+------+-------------+-----------+
|   16 | Module 1 |      NULL |   19 | Submodule 1 |        16 |
|   16 | Module 1 |      NULL |   20 | Submodule 2 |        16 |
|   16 | Module 1 |      NULL |   22 | Submodule 3 |        16 |
|   25 | Module 3 |      NULL |   26 | Submodule 4 |        25 |
|   25 | Module 3 |      NULL |   27 | Submodule 5 |        25 |
|   25 | Module 3 |      NULL |   28 | Submodule 6 |        25 |
+------+----------+-----------+------+-------------+-----------+
6 rows in set (0.00 sec)

si quieres simplificar el resultado:

mysql> select t1.id as ID, t1.modu as PARENT, t2.modu as SON from groups as t1 join groups as t2  on t1.id=t2.sub_group;
+------+----------+-------------+
| ID   | PARENT   | SON         |
+------+----------+-------------+
|   16 | Module 1 | Submodule 1 |
|   16 | Module 1 | Submodule 2 |
|   16 | Module 1 | Submodule 3 |
|   25 | Module 3 | Submodule 4 |
|   25 | Module 3 | Submodule 5 |
|   25 | Module 3 | Submodule 6 |
+------+----------+-------------+
6 rows in set (0.00 sec)

Solo mostrará los módulos con Niños:

Si desea mostrarlos todos, puede hacer esto

mysql> select t1.id as ID, t1.modu as PARENT, t2.modu as SON from groups as t1 join groups as t2  on t1.id=IFNULL(t2.sub_group,t2.id);
+------+----------+-------------+
| ID   | PARENT   | SON         |
+------+----------+-------------+
|   16 | Module 1 | Module 1    |
|   16 | Module 1 | Submodule 1 |
|   16 | Module 1 | Submodule 2 |
|   16 | Module 1 | Submodule 3 |
|   24 | Module 2 | Module 2    |
|   25 | Module 3 | Module 3    |
|   25 | Module 3 | Submodule 4 |
|   25 | Module 3 | Submodule 5 |
|   25 | Module 3 | Submodule 6 |
+------+----------+-------------+
9 rows in set (0.00 sec)

o de esta manera

mysql> select t1.id as ID, t1.modu as PARENT, if(t2.modu=t1.id,NULL,t2.sub_group) as SON from groups as t1 join groups as t2  on t1.id=IFNULL(t2.sub_group,t2.id);
+------+----------+------+
| ID   | PARENT   | SON  |
+------+----------+------+
|   16 | Module 1 | NULL |
|   16 | Module 1 |   16 |
|   16 | Module 1 |   16 |
|   16 | Module 1 |   16 |
|   24 | Module 2 | NULL |
|   25 | Module 3 | NULL |
|   25 | Module 3 |   25 |
|   25 | Module 3 |   25 |
|   25 | Module 3 |   25 |
+------+----------+------+
9 rows in set, 9 warnings (0.00 sec)

contestado el 22 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.