MySQL - Varios registros por fila MYSQL

 
Vista:
Imágen de perfil de Arley
Val: 11
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Varios registros por fila MYSQL

Publicado por Arley (5 intervenciones) el 16/05/2018 22:03:45
Hola la verdad es que soy nuevo en esto de bases de datos en mysql pero me gusta aprender y quiciera me asesoren sobre esta consulta.

Tengo una tabla principal que por cada fila puede o no tener varios registros, y lo que quiero es poder separar cada registro de cada fila y categorizarlo para poder saber cuantos registros hay en total por cada fila y asi poderlos guardar en una tabla nueva, podrian ayudarme de antemano muchas gracias por la colaboración y asesoria que me puedan brindar.

adjunto archivo en formato de excel y fotografia.
tabla
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Varios registros por fila MYSQL

Publicado por leonardo_josue (414 intervenciones) el 17/05/2018 22:06:32
Hola Arley:

De entrada te comento que tienes un muy mal diseño de tablas. Si estuvieras en una clase de modelado de Base de Datos, seguramente estarías reprobado... si puedes, cambia tu modelo para tener tu información en forma de renglones, no de columnas... así no tendrás desperdicio de campos.

Ahora, bien, si no puedes cambiar tu modelo, entonces puedes "simular" que tu información está en renglones con UNION's, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> SELECT * FROM tabla;
+------+--------+--------+--------+
| id   | campo1 | campo2 | campo3 |
+------+--------+--------+--------+
|    A | uno    | one    | un     |
|    B | dos    | two    | NULL   |
|    C | tres   | NULL   | NULL   |
+------+--------+--------+--------+
3 rows in set (0.00 sec)
 
mysql> SELECT id, campo1 campo FROM tabla WHERE campo1 IS NOT NULL
    -> UNION ALL
    -> SELECT id, campo2 campo FROM tabla WHERE campo2 IS NOT NULL
    -> UNION ALL
    -> SELECT id, campo3 campo FROM tabla WHERE campo3 IS NOT NULL;
+------+-------+
| id   | campo |
+------+-------+
|    A | uno   |
|    B | dos   |
|    C | tres  |
|    A | one   |
|    B | two   |
|    A | un    |
+------+-------+
6 rows in set (0.02 sec)

Observa que aquí ya no hay columnas con valores de NULL, (lo una de las razones por la que tu modelo no es correcto) y así simplemente agrupas y cuentas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT id, COUNT(1) total
    -> FROM
    -> ( SELECT id, campo1 campo FROM tabla WHERE campo1 IS NOT NULL
    ->   UNION ALL
    ->   SELECT id, campo2 campo FROM tabla WHERE campo2 IS NOT NULL
    ->   UNION ALL
    ->   SELECT id, campo3 campo FROM tabla WHERE campo3 IS NOT NULL
    -> ) T
    -> GROUP BY id;
+------+-------+
| id   | total |
+------+-------+
|    A |     3 |
|    B |     2 |
|    C |     1 |
+------+-------+
3 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Arley
Val: 11
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Varios registros por fila MYSQL

Publicado por Arley (5 intervenciones) el 18/05/2018 04:39:10
La verdad es que, ese modelo de datos me lo entregan así, y la idea es no modificar el archivo original, por eso necesito cambiarlo a un modelo con mejor arquitectura para poder trabajar de una manera mas adecuada y comprensible.

Muchas gracias por la ayuda haré las pruebas y estaré comentando como me va con las mismas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Arley
Val: 11
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Varios registros por fila MYSQL

Publicado por Arley (5 intervenciones) el 18/05/2018 17:03:04
Hola muchas gracias por la información hice las pruebas y me ha servido para hacer un conteo de los registros ahora tengo lo siguiente:

SELECT ID, MATERIAL, PROPIETARIO FROM TABLA WHERE PROPIETARIO IS NOT NULL
UNION ALL
SELECT ID, MATERIAL, PROPIETARIO FROM TABLA WHERE PROPIETARIO='Juan' AND Propi_1='Andres' OR PROPIETARIO='Juan' AND Propi_2='Andres' OR PROPIETARIO='Juan' AND Propi_3='Andres'

Esta consulta me lista dos veces la primera fila como puedo hacer, para añadir varias columnas (como por ejemplo la fecha actual) y que en el primer registro me escriba registro principal y luego los demas que valla encontrando escriba registro de apoyo y que este proceso se me repita con cada fila.

La segunda fila debera devolver tres filas y la tercera cuatro filas y la cuarta cinco filas.

Muchas Gracias.

NEW2

NEW
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Varios registros por fila MYSQL

Publicado por leonardo_josue (414 intervenciones) el 18/05/2018 21:47:23
Hola de nuevo Arley:

Tu puedes agregar tantas columnas como necesites en tu SELECT, con valores fijos o con valores variables. veamos si un ejemplo queda más claro.

Como puse en mi primer ejemplo, voy a suponer que tienes esta tabla;

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM tabla;
+------+--------+--------+--------+
| id   | campo1 | campo2 | campo3 |
+------+--------+--------+--------+
| A    | uno    | one    | un     |
| B    | dos    | two    | NULL   |
| C    | tres   | NULL   | NULL   |
+------+--------+--------+--------+
3 rows in set (0.01 sec)

Entonces, puedo hacer un registro PRINCIPAL seleccionando sólo la el id y el campo1, entonces, puedo poner algo así:

1
2
3
4
5
6
7
8
9
mysql> SELECT id, campo1, 1 nivel, 'REGISTRO principal' columna_de_objeto, CURDATE() fecha_actual FROM tabla;
+------+--------+-------+--------------------+--------------+
| id   | campo1 | nivel | columna_de_objeto  | fecha_actual |
+------+--------+-------+--------------------+--------------+
| A    | uno    |     1 | REGISTRO principal | 2018-05-18   |
| B    | dos    |     1 | REGISTRO principal | 2018-05-18   |
| C    | tres   |     1 | REGISTRO principal | 2018-05-18   |
+------+--------+-------+--------------------+--------------+
3 rows in set (0.00 sec)

Observa que las columnas NIVEL (que usaré más adelante), COLUMNA_DE_OBJETO y FECHA ACTUAL son valores CONSTANTES EN TODOS LOS REGISTROS...

PARA LOS REGISTROS DE APOYO, puedo hacer lo mismo, pero ahora en lugar de poner el campo1 pongo aquellos registros que tengan un valor en CAMPO2:

1
2
3
4
5
6
7
8
mysql> SELECT id, campo2, 2 nivel,  'REGISTRO de apoyo 1' columna_de_objeto, CURDATE() fecha_actual FROM tabla WHERE campo2 IS NOT NULL;
+------+--------+-------+---------------------+--------------+
| id   | campo2 | nivel | columna_de_objeto   | fecha_actual |
+------+--------+-------+---------------------+--------------+
| A    | one    |     2 | REGISTRO de apoyo 1 | 2018-05-18   |
| B    | two    |     2 | REGISTRO de apoyo 1 | 2018-05-18   |
+------+--------+-------+---------------------+--------------+
2 rows in set (0.00 sec)

y algo similar sería para el registro de apoyo 2... entonces, mi union podría quedar así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT id, campo1, 1 nivel, 'REGISTRO principal' columna_de_objeto, CURDATE() fecha_actual FROM tabla
    -> UNION ALL
    -> SELECT id, campo2, 2 nivel,  'REGISTRO de apoyo 1' columna_de_objeto, CURDATE() fecha_actual FROM tabla WHERE campo2 IS NOT NULL
    -> UNION ALL
    -> SELECT id, campo3, 3 nivel, 'REGISTRO de apoyo 2' columna_de_objeto, CURDATE() fecha_actual FROM tabla WHERE campo3 IS NOT NULL;
+------+--------+-------+---------------------+--------------+
| id   | campo1 | nivel | columna_de_objeto   | fecha_actual |
+------+--------+-------+---------------------+--------------+
| A    | uno    |     1 | REGISTRO principal  | 2018-05-18   |
| B    | dos    |     1 | REGISTRO principal  | 2018-05-18   |
| C    | tres   |     1 | REGISTRO principal  | 2018-05-18   |
| A    | one    |     2 | REGISTRO de apoyo 1 | 2018-05-18   |
| B    | two    |     2 | REGISTRO de apoyo 1 | 2018-05-18   |
| A    | un     |     3 | REGISTRO de apoyo 2 | 2018-05-18   |
+------+--------+-------+---------------------+--------------+
6 rows in set (0.00 sec)

Ahora, observa que los registros NO ESTÁN ORDENADOS, entonces puedes usar el campo NIVEL que se creó, para ordenar los datos y que los ID's queden "juntos", esto lo harías con una subconsulta así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SELECT id, campo1, columna_de_objeto, fecha_actual
    -> FROM
    -> ( SELECT id, campo1, 1 nivel, 'REGISTRO principal' columna_de_objeto, CURDATE() fecha_actual FROM tabla
    ->   UNION ALL
    ->   SELECT id, campo2, 2 nivel,  'REGISTRO de apoyo 1' columna_de_objeto, CURDATE() fecha_actual FROM tabla WHERE campo2 IS NOT NULL
    ->   UNION ALL
    ->   SELECT id, campo3, 3 nivel, 'REGISTRO de apoyo 2' columna_de_objeto, CURDATE() fecha_actual FROM tabla WHERE campo3 IS NOT NULL
    -> ) T
    -> ORDER BY T.id, T.nivel;
+------+--------+---------------------+--------------+
| id   | campo1 | columna_de_objeto   | fecha_actual |
+------+--------+---------------------+--------------+
| A    | uno    | REGISTRO principal  | 2018-05-18   |
| A    | one    | REGISTRO de apoyo 1 | 2018-05-18   |
| A    | un     | REGISTRO de apoyo 2 | 2018-05-18   |
| B    | dos    | REGISTRO principal  | 2018-05-18   |
| B    | two    | REGISTRO de apoyo 1 | 2018-05-18   |
| C    | tres   | REGISTRO principal  | 2018-05-18   |
+------+--------+---------------------+--------------+
6 rows in set (0.00 sec)

¿Se entiende? haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Arley
Val: 11
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Varios registros por fila MYSQL

Publicado por Arley (5 intervenciones) el 19/05/2018 23:17:12
Muchas Gracias por las repuestas, haré las pruebas
y luego comento sobre como me ha funcionado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Arley
Val: 11
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Varios registros por fila MYSQL

Publicado por Arley (5 intervenciones) el 20/05/2018 05:07:43
Muchas gracias ha sido de mucha ayuda y lo he podido acomodar a mis necesidades.
EXCELENTE EL APORTE.

Estoy tratando de insertar la consulta, pero me duplica la información y quiero que sea en una tabla existente y no creando una tabla nueva, podrías ayudarme con esto.
Muchas Gracias de nuevo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO resultado
SELECT id, Propietario, Columna_de_objeto , fecha_Normalizado
    FROM
    ( SELECT id, Propietario, 1 nivel, 'PRINCIPAL' Columna_de_objeto, CURDATE() fecha_Normalizado FROM cestillal
    UNION ALL
    SELECT id, Propietario, 2 nivel, 'Apoyo' Columna_de_objeto, CURDATE() fecha_Normalizado FROM cestillal WHERE OPER_1 IS NOT NULL
    UNION ALL
    SELECT id, Propietario, 3 nivel, 'Apoyo' Columna_de_objeto, CURDATE() fecha_Normalizado FROM cestillal WHERE OPER_2 IS NOT NULL
     UNION ALL
    SELECT id, Propietario, 4 nivel, 'Apoyo' Columna_de_objeto, CURDATE() fecha_Normalizado FROM cestillal WHERE OPER_3 IS NOT NULL
     UNION ALL
    SELECT id, Propietario, 5 nivel, 'Apoyo' Columna_de_objeto, CURDATE() fecha_Normalizado FROM cestillal WHERE ENER_1 IS NOT NULL
    ) T
    ORDER BY T.id, T.nivel;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar