Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

obtener y agrupar dependencias

Estas en el tema de obtener y agrupar dependencias en el foro de Mysql en Foros del Web. siento que pretendo reinventar la rueda... seguro que alguno ya ha visto esto antes en algun sitio: tengo una tabla y en la misma tabla ...
  #1 (permalink)  
Antiguo 17/12/2014, 15:09
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 14 años
Puntos: 66
obtener y agrupar dependencias

siento que pretendo reinventar la rueda... seguro que alguno ya ha visto esto antes en algun sitio:
tengo una tabla y en la misma tabla tengo marcado que registro depende de quien pongo un ejemplo

Código:
id          padre         nombre
1            0             1
2            0             2
3            1             1.1 
4            2             2.1
5            3             2.1.1
6            5             2.1.1.1
los elementos dependen de otros elementos de la misma tabla, y estoy tratando de obtener la lista completa ordenada como si fuese un tree view,

¿alguien se ha encontrado ya con esto?
  #2 (permalink)  
Antiguo 17/12/2014, 16:00
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: obtener y agrupar dependencias

Hola juanito1712:

Suponiendo que el id de un padre siempre será menor que el id de un hijo, puedes hacerlo así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-------+---------+
  3. | id   | padre | nombre  |
  4. +------+-------+---------+
  5. |    1 |     0 | 1       |
  6. |    2 |     0 | 2       |
  7. |    3 |     1 | 1.1     |
  8. |    4 |     2 | 2.1     |
  9. |    5 |     3 | 2.1.1   |
  10. |    6 |     5 | 2.1.1.1 |
  11. +------+-------+---------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT * FROM tabla ORDER BY IF(padre = 0, id, padre), id;
  15. +------+-------+---------+
  16. | id   | padre | nombre  |
  17. +------+-------+---------+
  18. |    1 |     0 | 1       |
  19. |    3 |     1 | 1.1     |
  20. |    2 |     0 | 2       |
  21. |    4 |     2 | 2.1     |
  22. |    5 |     3 | 2.1.1   |
  23. |    6 |     5 | 2.1.1.1 |
  24. +------+-------+---------+
  25. 6 rows in set (0.00 sec)

haz la prueba y nos comentas, si tienes problemas, postea los casos que no cumplen con la ordenación para poder indicarte alguna otra alternativa.

Saludos
Leo.
  #3 (permalink)  
Antiguo 17/12/2014, 17:04
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 14 años
Puntos: 66
Respuesta: obtener y agrupar dependencias

llevo un rato intentando comprender esta consulta y no hay manera

me sabe fatal pedirlo asi... me molaria mas haber conseguido aprender que estas haciendo en esa consulta y poder modificarla para que me sirva, pero los tres ultimos registros se descuadran y no entiendo ni por que :(
Código MySQL:
Ver original
  1. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  2. SET time_zone = "+00:00";
  3.  
  4.  
  5. CREATE TABLE IF NOT EXISTS `modelos` (
  6.   `modelosId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  7.   `modelosPadre` int(10) unsigned NOT NULL,
  8.   `modelosNombre` text NOT NULL,
  9.   PRIMARY KEY (`modelosId`)
  10. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=65 ;
  11.  
  12. --
  13. -- Volcado de datos para la tabla `modelos`
  14. --
  15.  
  16. INSERT INTO `modelos` (`modelosId`, `modelosPadre`, `modelosNombre`) VALUES
  17. (1, 0, 'BMW'),
  18. (2, 0, 'SEAT'),
  19. (3, 0, 'Peugeot'),
  20. (6, 0, 'FIAT'),
  21. (7, 0, 'volvo'),
  22. (8, 0, 'Ford'),
  23. (9, 0, 'audi'),
  24. (10, 0, 'volkswagen'),
  25. (11, 0, 'renault'),
  26. (12, 0, 'hyundai'),
  27. (13, 0, 'nissan'),
  28. (14, 0, 'opel'),
  29. (15, 0, 'dacia'),
  30. (16, 0, 'citroen'),
  31. (17, 0, 'mercedes'),
  32. (18, 0, 'chrysler'),
  33. (19, 0, 'toyota'),
  34. (20, 0, 'honda'),
  35. (21, 1, '320'),
  36. (22, 3, '206'),
  37. (23, 4, 'prueba'),
  38. (24, 7, '123'),
  39. (25, 3, '207'),
  40. (26, 3, '306'),
  41. (27, 3, '307'),
  42. (28, 2, 'Ibiza1'),
  43. (29, 2, 'ibiza  2'),
  44. (30, 8, 'tourneo'),
  45. (31, 9, 'a3'),
  46. (32, 10, 'golf'),
  47. (33, 11, '19'),
  48. (34, 8, 'escort'),
  49. (35, 12, 'accent'),
  50. (36, 13, 'micra'),
  51. (37, 2, 'toledo'),
  52. (38, 2, 'inca'),
  53. (39, 8, 'focus'),
  54. (40, 3, 'partner'),
  55. (41, 6, 'brava'),
  56. (42, 14, 'vectra'),
  57. (43, 10, 'polo'),
  58. (44, 11, 'clio'),
  59. (45, 15, 'logan'),
  60. (46, 11, 'scenic'),
  61. (48, 16, 'jumper'),
  62. (49, 17, 'clk'),
  63. (50, 8, 'mondeo'),
  64. (51, 9, 'a6'),
  65. (52, 16, 'xsara'),
  66. (53, 1, 'e36'),
  67. (54, 18, 'voyager'),
  68. (55, 6, 'bravo'),
  69. (56, 11, '5'),
  70. (57, 13, 'trade'),
  71. (58, 19, 'celica'),
  72. (59, 20, 'accord'),
  73. (60, 8, 'cougar'),
  74. (61, 6, 'stilo'),
  75. (62, 50, '1.8g'),
  76. (63, 62, 'gasolina'),
  77. (64, 63, '99');

estoy revisando y creo que me he confundido en la primera tabla de ejemplo al poner padres y tal...

Última edición por gnzsoloyo; 17/12/2014 a las 20:05 Razón: Mal etiquetado.
  #4 (permalink)  
Antiguo 17/12/2014, 20:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: obtener y agrupar dependencias

Código SQL:
Ver original
  1. mysql> SELECT
  2.     ->     REPLACE(CAST(CONCAT(M1.modelosId,
  3.     ->                 '.',
  4.     ->                 IFNULL(M2.modelosid, ''),
  5.     ->                 '.',
  6.     ->                 IFNULL(M3.modelosid, ''))
  7.     ->         AS CHAR (100)),  '..', '')  IdModelo,
  8.     ->     CONCAT(M1.modelosNombre,
  9.     ->             ' ',
  10.     ->             IFNULL(M2.ModelosNombre, ''), ' ',
  11.     ->             IFNULL(M3.ModelosNombre, ''))nombre
  12.     -> FROM
  13.     ->     modelos M1
  14.     ->         LEFT JOIN
  15.     ->     modelos M2 ON M1.modelosId = M2.modelosPadre
  16.     ->         LEFT JOIN
  17.     ->     modelos M3 ON M2.modelosId = M3.modelosPadre
  18.     -> ORDER BY M1.modelosId , M2.modelosId , M3.modelosId;
  19. +----------+----------------------+
  20. | IdModelo | nombre               |
  21. +----------+----------------------+
  22. | 1.21.    | BMW 320              |
  23. | 1.53.    | BMW e36              |
  24. | 2.28.    | SEAT Ibiza1          |
  25. | 2.29.    | SEAT ibiza  2        |
  26. | 2.37.    | SEAT toledo          |
  27. | 2.38.    | SEAT inca            |
  28. | 3.22.    | Peugeot 206          |
  29. | 3.25.    | Peugeot 207          |
  30. | 3.26.    | Peugeot 306          |
  31. | 3.27.    | Peugeot 307          |
  32. | 3.40.    | Peugeot partner      |
  33. | 6.41.    | FIAT brava           |
  34. | 6.55.    | FIAT bravo           |
  35. | 6.61.    | FIAT stilo           |
  36. | 7.24.    | volvo 123            |
  37. | 8.30.    | Ford tourneo         |
  38. | 8.34.    | Ford escort          |
  39. | 8.39.    | Ford focus           |
  40. | 8.50.62  | Ford mondeo 1.8g     |
  41. | 8.60.    | Ford cougar          |
  42. | 9.31.    | audi a3              |
  43. | 9.51.    | audi a6              |
  44. | 10.32.   | volkswagen golf      |
  45. | 10.43.   | volkswagen polo      |
  46. | 11.33.   | renault 19           |
  47. | 11.44.   | renault clio         |
  48. | 11.46.   | renault scenic       |
  49. | 11.56.   | renault 5            |
  50. | 12.35.   | hyundai accent       |
  51. | 13.36.   | nissan micra         |
  52. | 13.57.   | nissan trade         |
  53. | 14.42.   | opel vectra          |
  54. | 15.45.   | dacia logan          |
  55. | 16.48.   | citroen jumper       |
  56. | 16.52.   | citroen xsara        |
  57. | 17.49.   | mercedes clk         |
  58. | 18.54.   | chrysler voyager     |
  59. | 19.58.   | toyota celica        |
  60. | 20.59.   | honda accord         |
  61. | 21       | 320                  |
  62. | 22       | 206                  |
  63. | 23       | prueba               |
  64. | 24       | 123                  |
  65. | 25       | 207                  |
  66. | 26       | 306                  |
  67. | 27       | 307                  |
  68. | 28       | Ibiza1               |
  69. | 29       | ibiza  2             |
  70. | 30       | tourneo              |
  71. | 31       | a3                   |
  72. | 32       | golf                 |
  73. | 33       | 19                   |
  74. | 34       | escort               |
  75. | 35       | accent               |
  76. | 36       | micra                |
  77. | 37       | toledo               |
  78. | 38       | inca                 |
  79. | 39       | focus                |
  80. | 40       | partner              |
  81. | 41       | brava                |
  82. | 42       | vectra               |
  83. | 43       | polo                 |
  84. | 44       | clio                 |
  85. | 45       | logan                |
  86. | 46       | scenic               |
  87. | 48       | jumper               |
  88. | 49       | clk                  |
  89. | 50.62.63 | mondeo 1.8g gasolina |
  90. | 51       | a6                   |
  91. | 52       | xsara                |
  92. | 53       | e36                  |
  93. | 54       | voyager              |
  94. | 55       | bravo                |
  95. | 56       | 5                    |
  96. | 57       | trade                |
  97. | 58       | celica               |
  98. | 59       | accord               |
  99. | 60       | cougar               |
  100. | 61       | stilo                |
  101. | 62.63.64 | 1.8g gasolina 99     |
  102. | 63.64.   | gasolina 99          |
  103. | 64       | 99                   |
  104. +----------+----------------------+
  105. 82 ROWS IN SET (0.02 sec)
Por cada nivel de profundidad encontrado se requiere un nuevo nivel de LEFT JOIN contra la misma tabla, y ampliar los CONCAT con los respectivos campos.

Personalmente considero que la tabla está mal diseñada, porque estás mezclando en la misma tabla tres conceptos diferentes: Marca, Modelo y DetalleModelo. Son conceptos distintos que deberían estar en tablas diferentes.
A ese esquema le falta normalización.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: agrupar, dependencias, registro, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:28.