MySQL - Consulta con select anidados o Joins

 
Vista:
sin imagen de perfil

Consulta con select anidados o Joins

Publicado por cristian (2 intervenciones) el 15/09/2016 01:21:15
Hola amigos, quisiera pedir su apoyo con lo siguiente. Tengo estas 3 consultas que funcionan perfecto separadas:

SELECT CONCAT(u.nombres, ' ',u.apellido_p, ' ',u.apellido_m) as usuario, SUM(ac.hora_hombre_acti) as total_act
FROM actividades ac
LEFT JOIN usuarios.personal u
ON ac.usu_id_acti = u.id_per
WHERE ac.tipo_acti = 1
AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-11'))
GROUP BY ac.usu_id_acti

SELECT CONCAT(u.nombres, ' ',u.apellido_p, ' ',u.apellido_m) as usuario, SUM(ac.hora_hombre_acti) as total_act
FROM actividades ac
LEFT JOIN usuarios.personal u
ON ac.usu_id_acti = u.id_per
WHERE ac.tipo_acti = 2
AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-11'))
GROUP BY ac.usu_id_acti

SELECT CONCAT(u.nombres, ' ',u.apellido_p, ' ',u.apellido_m) as usuario, av.usu_id_av as usuario, SUM(av.hora_hombre) as total_av
FROM avances av
LEFT JOIN usuarios.personal u
ON av.usu_id_av = u.id_per
WHERE WEEK(date(av.fecha_modif_av)) = WEEK(DATE('2016-08-11'))
GROUP BY av.usu_id_av

El tema es que necesito que esten en una sola consulta para poder obtener los resultados se la siguiente manera:

usuario----------------total_act1----total_act2-----total_av-------TOTALES
cristian fuentes----------2-----------------7-------------56---------------65
gabriel soez--------------8-----------------5-------------34---------------47

Espero me puedan ayudar a resolver este problema, ya que llevo días estancado en esto.

Muchas gracias.
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

Consulta con select anidados o Joins

Publicado por cristian (2 intervenciones) el 16/09/2016 00:45:46
He logrado que me muestre la información como necesito con el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT CONCAT(g.nombre_gra, ' ' ,u.nombres, ' ',u.apellido_p, ' ',u.apellido_m) as usuario, IFNULL(p.total_ac1,0) as total_ac1, IFNULL(g.total_ac2,0) as total_ac2, IFNULL(f.total_av,0) as total_av, IFNULL(p.total_ac1,0)+IFNULL(g.total_ac2,0) + IFNULL(f.total_av,0) as totales
      FROM (
      SELECT av.usu_id_av, SUM(av.hora_hombre) as total_av
      FROM info.avances av  WHERE WEEK(date(av.fecha_modif_av)) = WEEK(DATE('2016-08-03')) GROUP BY av.usu_id_av) f
      LEFT JOIN (
      SELECT ac.usu_id_acti, ac.fecha_mod_acti, SUM(ac.hora_hombre_acti) as total_ac1
      FROM info.actividades ac WHERE ac.tipo_acti = 1 AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-03')) GROUP BY ac.usu_id_acti) p
      ON f.usu_id_av = p.usu_id_acti
      LEFT JOIN (
      SELECT ac.usu_id_acti, ac.fecha_mod_acti, SUM(ac.hora_hombre_acti) as total_ac2
      FROM info.actividades ac WHERE ac.tipo_acti = 2 AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-03')) GROUP BY ac.usu_id_acti) g
      ON f.usu_id_av = g.usu_id_acti
      LEFT JOIN usuarios.personal u
      ON f.usu_id_av = u.id_per
      INNER JOIN usuarios.grados as g
      ON g.id_gra = u.grado_id


El problema es que según cambio el orden de los SELECT, hay información que queda no muestra; es decir, con la consulta que adjunto, si alguien no tiene registros en info.avances, no me muestra el resto de los registros en info.actividades.

Si cambio el orden de los SELECT, se alterna la información que no muestra al no tener registros.

Ojalá alguien me pueda guiar para que muestre todos los registros aunque en alguna tabla no registre datos.

Gracias
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

Consulta con select anidados o Joins

Publicado por Joaquin Morales (1 intervención) el 14/08/2018 02:08:12
Hola me ayudó su problema en problema similar que tenía y creo que ya se cual era la solución a su problema no creo que sea de mucha ayuda dado el tiempo que ha pasado pero quizas le pueda servir a alguien más, debes utilizar FULL OUTER JOIN en lugar LEFT JOIN, en MySQL al parecer no existe FULL OUTER JOIN pero lo puedes simular con LEFT OUTER JOIN con una UNION a la misma consulta pero usando RIGHT OUTER JOIN de esta forma:

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
27
28
29
30
31
32
33
34
35
SELECT CONCAT(g.nombre_gra, ' ' ,u.nombres, ' ',u.apellido_p, ' ',u.apellido_m) as usuario, IFNULL(p.total_ac1,0) as total_ac1, IFNULL(g.total_ac2,0) as total_ac2, IFNULL(f.total_av,0) as total_av, IFNULL(p.total_ac1,0)+IFNULL(g.total_ac2,0) + IFNULL(f.total_av,0) as totales
      FROM (
      SELECT av.usu_id_av, SUM(av.hora_hombre) as total_av
      FROM info.avances av  WHERE WEEK(date(av.fecha_modif_av)) = WEEK(DATE('2016-08-03')) GROUP BY av.usu_id_av) f
      LEFT JOIN (
      SELECT ac.usu_id_acti, ac.fecha_mod_acti, SUM(ac.hora_hombre_acti) as total_ac1
      FROM info.actividades ac WHERE ac.tipo_acti = 1 AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-03')) GROUP BY ac.usu_id_acti) p
      ON f.usu_id_av = p.usu_id_acti
      LEFT JOIN (
      SELECT ac.usu_id_acti, ac.fecha_mod_acti, SUM(ac.hora_hombre_acti) as total_ac2
      FROM info.actividades ac WHERE ac.tipo_acti = 2 AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-03')) GROUP BY ac.usu_id_acti) g
      ON f.usu_id_av = g.usu_id_acti
      LEFT JOIN usuarios.personal u
      ON f.usu_id_av = u.id_per
      INNER JOIN usuarios.grados as g
      ON g.id_gra = u.grado_id
 
UNION
 
SELECT CONCAT(g.nombre_gra, ' ' ,u.nombres, ' ',u.apellido_p, ' ',u.apellido_m) as usuario, IFNULL(p.total_ac1,0) as total_ac1, IFNULL(g.total_ac2,0) as total_ac2, IFNULL(f.total_av,0) as total_av, IFNULL(p.total_ac1,0)+IFNULL(g.total_ac2,0) + IFNULL(f.total_av,0) as totales
      FROM (
      SELECT av.usu_id_av, SUM(av.hora_hombre) as total_av
      FROM info.avances av  WHERE WEEK(date(av.fecha_modif_av)) = WEEK(DATE('2016-08-03')) GROUP BY av.usu_id_av) f
      RIGHT JOIN (
      SELECT ac.usu_id_acti, ac.fecha_mod_acti, SUM(ac.hora_hombre_acti) as total_ac1
      FROM info.actividades ac WHERE ac.tipo_acti = 1 AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-03')) GROUP BY ac.usu_id_acti) p
      ON f.usu_id_av = p.usu_id_acti
      RIGHT JOIN (
      SELECT ac.usu_id_acti, ac.fecha_mod_acti, SUM(ac.hora_hombre_acti) as total_ac2
      FROM info.actividades ac WHERE ac.tipo_acti = 2 AND WEEK(date(ac.fecha_mod_acti)) = WEEK(DATE('2016-08-03')) GROUP BY ac.usu_id_acti) g
      ON f.usu_id_av = g.usu_id_acti
      RIGHT JOIN usuarios.personal u
      ON f.usu_id_av = u.id_per
      INNER JOIN usuarios.grados as g
      ON g.id_gra = u.grado_id

Espero que le sirva a alguien,

saludos
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