MySQL - Ayuda consulta - Mysql Group_concat

   
Vista:

Ayuda consulta - Mysql Group_concat

Publicado por Diego Zavala (9 intervenciones) el 27/03/2018 23:58:35
Espero y me puedan ayudar.

Tengo el siguiente query:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
select
t1.idPersona, t1.Nombre, t1.ApPaterno, t1.ApMaterno,
t2.usuario as NombreUsuario,
t2.pasword as Contraseña,
t2.Rol, t2.credencial as NumCredecial,
t2.cargo as Area_o_Cargo,
t3.UsuariofkUsuarios as UsuarioAlta,
t3.UsuariofkUsuariosA as UsuarioAltaPermiso,
t4.UsuariofkUsuario as UsuarioAltaFormato,
 
group_concat(distinct concat( t4.NombreFormato, ':', t3.Accion)) as NombreFormato_Y_Accion,
 
t3.Activo from personas as t1
 
inner join usuarios as t2 on t1.idPersona = t2.personafkpersonas
inner join permisos as t3 on t2.idUsuario = t3.usuariofkusuarios
inner join cformatos as t4 on t3.FormatofkCFormatos = t4.idCFormato
 
where t2.activo = 'si' and t3.activo = 'si'  group by t1.idpersona;

obtengo el siguiente resultado:

Ejemplo:

id | Campo1
1 | Venta: r1, Venta: r2, Usuario: r3, Usuario: r4

Ahora si quiero visualizar los datos de la siguiente forma:

id | Campo1
1 | Venta = r1, r2, Usuario= r3, r4

¿Como lo haria ?, gracias por su ayuda
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

Ayuda consulta - Mysql Group_concat

Publicado por Leonardo Josué (383 intervenciones) el 28/03/2018 17:03:37
Hola Diego:

Puedes hacer una agrupación condicional utilizando CASE WHEN, más o menos así:

Supongamos que tienes esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT * FROM tabla;
+------+---------------+--------+
| id   | nombreFormato | Accion |
+------+---------------+--------+
|    1 | venta         | r1     |
|    1 | venta         | r2     |
|    1 | usuario       | r3     |
|    1 | usuario       | r4     |
|    2 | venta         | r1     |
|    2 | venta         | r2     |
|    3 | usuario       | r3     |
|    3 | usuario       | r4     |
+------+---------------+--------+
8 rows in set (0.00 sec)

que sería según entiendo más o menos tu caso (aunque tú tienes la información en varias tablas, pero la idea será la misma)

tal como tienes tu GROUP_CONCAT, tienes esto:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT
    ->   GROUP_CONCAT(DISTINCT CONCAT( NombreFormato, ':', Accion)) AS NombreFormato_Y_Accion
    -> FROM tabla
    -> GROUP BY id;
+-----------------------------------------+
| NombreFormato_Y_Accion                  |
+-----------------------------------------+
| venta:r1,venta:r2,usuario:r3,usuario:r4 |
| venta:r1,venta:r2                       |
| usuario:r3,usuario:r4                   |
+-----------------------------------------+
3 rows in set (0.00 sec)

entonces, lo que tendrías que hacer es considerar el NOMBREFORMATO dentro de una condición, para saber si concatenas la palabra VENTA o USUARIO según sea el caso, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT
    ->      id,
    ->      CASE nombreFormato
    ->        WHEN 'venta'   THEN CONCAT('venta = ', GROUP_CONCAT(accion))
    ->        WHEN 'usuario' THEN CONCAT('usuario = ', GROUP_CONCAT(accion))
    ->        ELSE ''
    ->      END campo1
    ->    FROM tabla
    ->    GROUP BY id, nombreFormato;
+------+-----------------+
| id   | campo1          |
+------+-----------------+
|    1 | usuario = r3,r4 |
|    1 | venta = r1,r2   |
|    2 | venta = r1,r2   |
|    3 | usuario = r3,r4 |
+------+-----------------+
4 rows in set (0.00 sec)

Esto te daría por ID y por NOMBREFORMATO lo que necesitas, ahora, observa que para el ID=1 aparecen dos registros por separado, uno para las ventas y otro para los usuarios, entonces podrías volver a agrupar esto como una subconsulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT id, GROUP_CONCAT(campo1) campo1 FROM
    -> (  SELECT
    ->      id,
    ->      CASE nombreFormato
    ->        WHEN 'venta'   THEN CONCAT('venta = ', GROUP_CONCAT(accion))
    ->        WHEN 'usuario' THEN CONCAT('usuario = ', GROUP_CONCAT(accion))
    ->        ELSE ''
    ->      END campo1
    ->    FROM tabla
    ->    GROUP BY id, nombreFormato ) T1
    -> GROUP BY id;
+------+-------------------------------+
| id   | campo1                        |
+------+-------------------------------+
|    1 | usuario = r3,r4,venta = r1,r2 |
|    2 | venta = r1,r2                 |
|    3 | usuario = r3,r4               |
+------+-------------------------------+
3 rows in set (0.00 sec)

Esta no es la única manera de hacerlo y posiblemente tampoco sea la mejor, pero bueno, espero que te pueda servir.

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

Ayuda consulta - Mysql Group_concat

Publicado por Diego (9 intervenciones) el 28/03/2018 19:53:53
Muchisimas gracias Leo, lo puede solucionar exitosamente.
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

Ayuda consulta - Mysql Group_concat

Publicado por Gustavo Chavez (1 intervención) el 02/04/2018 19:06:32
Hola Leo, excelente aporte.
Y si lo quisiera de forma aleatoria como seria ?
En este caso son pocos eventos los que se "registran" en el <when> pero puede que lleguen hacer mas de 50 (ejemplo)
Agradezco tu ayuda.
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

Ayuda consulta - Mysql Group_concat

Publicado por leonardo_josue (383 intervenciones) el 03/04/2018 20:48:09
Hola Gustavo:

¿A qué te refieres con que quieres que sea de forma aleatoria?, creo que es conveniente que en lugar de continuar con este post abras una nueva pregunta con tu planteamiento, y al igual que como está en este post, nos pongas primero algunos datos de ejemplo de tu tabla y nos digas qué es lo que esperas obtener como salida, así será más fácil que podamos ayudarte y sobre todo no "resucitamos" temas que ya están cerrados.

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
0
Comentar
Revisar política de publicidad