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

Problema consulta con Subquery y Join entre dos tablas

Estas en el tema de Problema consulta con Subquery y Join entre dos tablas en el foro de Mysql en Foros del Web. Hola Mi problema es el siguiente, tengo dos tablas la de usuario (usuario es unico) y la tabla de experiencia laboral (el usuario puede tener ...
  #1 (permalink)  
Antiguo 13/02/2006, 13:44
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 4 meses
Puntos: 8
Problema consulta con Subquery y Join entre dos tablas

Hola

Mi problema es el siguiente,

tengo dos tablas la de usuario (usuario es unico) y la tabla de experiencia laboral (el usuario puede tener mas de una experiencia laboral).

Necesito hacer una consulta SQL donde me muestre los datos del usuario (tabal de usuario) y solo una experiencia laboral (la ultima), mi problema es que no he podido dar con la consulta ya que al hacer el join me muestra todas las experiencia laboral del usuario y yo necesito solo la ultima.

bueno y tengo la siguiente consulta pero el problema es que me muestra null los campos de experiencia laboral desde el segundo usuario en adelante.

Código:
SELECT 

us.username,
exp.cargo_empresa,
exp.nombre_empresa,
exp.nombre_comuna_exp,
exp.nombre_region_exp,
exp.nombre_industria_exp,
exp.nombre_sector_exp,
exp.nombre_tipo_empresa,
exp.nombre_tamano_empresa,
exp.nombre_area_funcional
FROM (select id,username from posters group by id,username ORDER BY id) as us 

LEFT JOIN (SELECT 

pel.*,
pc2.nombre_comuna as nombre_comuna_exp,
pr2.nombre_region as nombre_region_exp,
pi2.nombre_industria as nombre_industria_exp,
ps2.nombre_sector as nombre_sector_exp,
ptipe.nombre_tipo_empresa as nombre_tipo_empresa,
pte.nombre_tamano_empresa as nombre_tamano_empresa,
paf.nombre_area_funcional as nombre_area_funcional
FROM prof_exp_laboral pel
				
LEFT JOIN prof_comunas pc2 ON (pc2.id_comuna=pel.id_comuna)
LEFT JOIN prof_regiones pr2 ON (pr2.id_region=pel.id_region)
LEFT JOIN prof_industrias pi2 ON (pi2.id_industria=pel.id_industria)
LEFT JOIN prof_sectores ps2 ON (ps2.id_sector=pel.id_sector)
LEFT JOIN prof_tipo_empresa ptipe ON (ptipe.id_tipo_empresa=pel.id_tipo_empresa)
LEFT JOIN prof_tamano_empresa pte ON (pte.id_tamano_empresa=pel.id_tamano_empresa)
LEFT JOIN prof_area_funcional paf ON (paf.id_area_funcional=pel.id_area_funcional)
ORDER BY id_exp ASC LIMIT 0,1) exp ON (exp.id_usuario=us.id)
Resultado:
Código:
nick    cargo_empresa     nombre_empresa       nombre_comuna_exp
admin       Consultor             test 		  Las Condes  
juan          NULL 		 NULL		  NULL 			  
pepe         NULL 		 NULL		  NULL
y si en la consulta elimino el
Código:
ASC LIMIT 0,1
me muestra bien las relaciones de tabla, pero me muestra cada una de las experiencia laboral de los usuarios,

Resultado:
Código:
username  cargo_empresa  nombre_empresa  nombre_comuna_exp
admin         Consultor                test                 Las Condes
juan           gerente                  test2               La Reina
pepe          Gerente                  test3               Las Condes
pepe          aaa 	                   Otra 	  Tortel
Sólo necesito que muestre una sola experiencia laboral por usuario (la ultima).
Este seria el resultado que necesito:

Resulatdo deseado:
Código:
username  cargo_empresa  nombre_empresa  nombre_comuna_exp  
admin          Consultor               test                Las Condes      
juan            gerente                 test2               La Reina 
pepe           Gerente                 test3               Las Condes
cualquier ayuda muchas gracias.

salu2

zsamer

Última edición por zsamer; 13/02/2006 a las 13:53
  #2 (permalink)  
Antiguo 13/02/2006, 18:08
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 4 meses
Puntos: 8
se entiende el problema?
alguna ayuda?
  #3 (permalink)  
Antiguo 15/02/2006, 09:52
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 4 meses
Puntos: 8
ninguna ayuda?
  #4 (permalink)  
Antiguo 15/02/2006, 12:59
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 18 años, 5 meses
Puntos: 5
tranquis no te exasperes, ahora segun entiendo la consulta, me parece que es correcto lo que te devuelve ya que estas limitando a una sola respuesta, ahora quiero saber sobre la estructura de la tabla prof_exp_laboral, ahi tienes alguna fecha que haga referencia al trabajo, otra forma no se me ocurre sin ver la estructura de las tablas, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #5 (permalink)  
Antiguo 15/02/2006, 15:51
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 4 meses
Puntos: 8
Cita:
Iniciado por deadlykyo
tranquis no te exasperes, ahora segun entiendo la consulta, me parece que es correcto lo que te devuelve ya que estas limitando a una sola respuesta, ahora quiero saber sobre la estructura de la tabla prof_exp_laboral, ahi tienes alguna fecha que haga referencia al trabajo, otra forma no se me ocurre sin ver la estructura de las tablas, cya
gracias por responder.

aqui va la estuctura de tablas:
Tabla usuarios (posters)
Código:
  
  `id` int(5) auto_increment (  PRIMARY KEY )
  `username` varchar(40)
  `password` varchar(50)
  `ultima_visita` timestamp(14)
  `email` varchar(50)

Tabla prof_exp_laboral
Código:
  
  `id_exp` int(5) auto_increment ( PRIMARY KEY )
  `id_usuario` int(5) ( Llave estrangera de tabla usuarios)
  `id_region` int(5)
  `id_comuna` int(5)
  `id_industria` int(5)
  `id_sector` int(5)
  `id_tipo_empresa` int(5)
  `id_tamano_empresa` int(5)
  `id_area_funcional` int(5)
  `nombre_empresa` varchar(255)
  `cargo_empresa` varchar(255)
  `fecha_inicio` datetime
  `fecha_fin` datetime
  `actual_cargo` int(1)
  `descripcion_cargo` text


gracias espero alguna ayuda.


salu2

zsamer
  #6 (permalink)  
Antiguo 17/02/2006, 09:16
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 18 años, 5 meses
Puntos: 5
porque no pruebas agruparlos por id_usuario y de ahi obtener el maximo de la fecha de usuario MAX(fecha), aqui te dejo una idea de como seria:
Código PHP:
//
SELECT 
us
.username,
exp.cargo_empresa,
exp.nombre_empresa,
exp.nombre_comuna_exp,
exp.nombre_region_exp,
exp.nombre_industria_exp,
exp.nombre_sector_exp,
exp.nombre_tipo_empresa,
exp.nombre_tamano_empresa,
exp.nombre_area_funcional
FROM 
(SELECT id,username from posters group by id,username ORDER BY id) as us 
LEFT JOIN 
 
(SELECT 
   pel
.*,
   
pc2.nombre_comuna as nombre_comuna_exp,
   
pr2.nombre_region as nombre_region_exp,
   
pi2.nombre_industria as nombre_industria_exp,
   
ps2.nombre_sector as nombre_sector_exp,
   
ptipe.nombre_tipo_empresa as nombre_tipo_empresa,
   
pte.nombre_tamano_empresa as nombre_tamano_empresa,
   
paf.nombre_area_funcional as nombre_area_funcional
 FROM 
   prof_exp_laboral pel
   LEFT JOIN prof_comunas pc2 ON 
(pc2.id_comuna=pel.id_comuna)
   
LEFT JOIN prof_regiones pr2 ON (pr2.id_region=pel.id_region)
   
LEFT JOIN prof_industrias pi2 ON (pi2.id_industria=pel.id_industria)
   
LEFT JOIN prof_sectores ps2 ON (ps2.id_sector=pel.id_sector)
   
LEFT JOIN prof_tipo_empresa ptipe ON (ptipe.id_tipo_empresa=pel.id_tipo_empresa)
   
LEFT JOIN prof_tamano_empresa pte ON (pte.id_tamano_empresa=pel.id_tamano_empresa)
   
LEFT JOIN prof_area_funcional paf ON (paf.id_area_funcional=pel.id_area_funcional)
 
WHERE
   pel
.fecha_inicio=MAX(pel.fecha_inicio)
 
GROUP BY
   pel
.id_usuarioexp ON (exp.id_usuario=us.id
cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #7 (permalink)  
Antiguo 19/02/2006, 17:31
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 4 meses
Puntos: 8
muchas gracias lo voy a probar y te cuento.

un abrazo

zsamer
  #8 (permalink)  
Antiguo 19/02/2006, 20:32
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 4 meses
Puntos: 8
Gracias deadlykyo, finalmente funcionó bastante bien, tuve que hacer un pequeño cambio, utilicé HEAVING en vez de WHERE para abtener la experiencia laboral mas reciente. aquí dejo el query por si alguien le sirve para algo similar.

También acepto recomendaciones para mejorar o optimizar el SQL u otra forma de sql para hacer esto mismo.

Código PHP:
//para la busqueda dentro del query

    
$search_query  'WHERE ( ';
    
$search_query .= 'us.nombre_usuario LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'us.apaterno_usuario LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'us.amaterno_usuario LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_comuna_us LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_region_us LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_industria LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_sector LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_carrera LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_universidad LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'exp.cargo_empresa LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'exp.nombre_area_funcional LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'exp.nombre_empresa LIKE "%' $palabra_clave '%" ';
    
$search_query .= ') ';

$result_busqueda_usuario mysql_query('SELECT
            us.id,
            us.username,
            us.nombre_usuario,
            us.apaterno_usuario,
            us.amaterno_usuario,
            us.image_name,
            us.thumb_name,
            us.objetivos,
            us.especialidades, 
            us.nombre_comuna_us,
            us.nombre_region_us,
            us.nombre_industria,
            us.nombre_sector,
            us.nombre_carrera,
            us.nombre_universidad,            
            exp.cargo_empresa,
            exp.nombre_empresa,
            exp.nombre_comuna_exp,
            exp.nombre_region_exp,
            exp.nombre_industria_exp,
            exp.nombre_sector_exp,
            exp.nombre_tipo_empresa,
            exp.nombre_tamano_empresa,
            exp.nombre_area_funcional FROM ' 
.'( SELECT     
            us2.id,
            us2.username,
            du.nombre_usuario, 
            du.apaterno_usuario,
            du.amaterno_usuario,
            du.image_name,
            du.thumb_name,
            pp.objetivos,
            pp.especialidades, 
            pc.nombre_comuna as nombre_comuna_us,
            pr.nombre_region as nombre_region_us,
            pi.nombre_industria,
            ps.nombre_sector,
            pcar.nombre_carrera,
            pun.nombre_universidad 
            FROM posters us2 '
.'LEFT JOIN prof_datos_usuarios du ON (us2.id=du.id_usuario) '
.'LEFT JOIN prof_comunas pc ON (pc.id_comuna=du.id_comuna) '
.'LEFT JOIN prof_regiones pr ON (pr.id_region=du.id_region) '
.'LEFT JOIN prof_profesion_usuarios pp ON (us2.id=pp.id_usuario) '
.'LEFT JOIN prof_industrias pi ON (pi.id_industria=pp.id_industria) '
.'LEFT JOIN prof_sectores ps ON (ps.id_sector=pp.id_sector) '
.'LEFT JOIN prof_carreras pcar ON (pcar.id_carrera=pp.id_carrera) '
.'LEFT JOIN prof_universidades pun ON (pun.id_universidad=pp.id_universidad) '
.'group by us2.id,us2.username ORDER BY us2.id) as us LEFT JOIN '            
.'(SELECT                 
            pel.id_usuario,
            pel.cargo_empresa,
            pel.nombre_empresa,
            pel.fecha_inicio,
            pc2.nombre_comuna as nombre_comuna_exp,
            pr2.nombre_region as nombre_region_exp,
            pi2.nombre_industria as nombre_industria_exp,
            ps2.nombre_sector as nombre_sector_exp,
            ptipe.nombre_tipo_empresa as nombre_tipo_empresa,
            pte.nombre_tamano_empresa as nombre_tamano_empresa,
            paf.nombre_area_funcional as nombre_area_funcional
            FROM prof_exp_laboral pel '
                    
.'LEFT JOIN prof_comunas pc2 ON (pc2.id_comuna=pel.id_comuna) '
.'LEFT JOIN prof_regiones pr2 ON (pr2.id_region=pel.id_region) '
.'LEFT JOIN prof_industrias pi2 ON (pi2.id_industria=pel.id_industria) '
.'LEFT JOIN prof_sectores ps2 ON (ps2.id_sector=pel.id_sector) '
.'LEFT JOIN prof_tipo_empresa ptipe ON (ptipe.id_tipo_empresa=pel.id_tipo_empresa) '
.'LEFT JOIN prof_tamano_empresa pte ON (pte.id_tamano_empresa=pel.id_tamano_empresa) '
.'LEFT JOIN prof_area_funcional paf ON (paf.id_area_funcional=pel.id_area_funcional) '
.'GROUP BY pel.id_usuario '
.'HAVING pel.fecha_inicio=MAX(pel.fecha_inicio) '
.') exp ON (exp.id_usuario=us.id) '    
$search_query .'order by us.id') or die (mysql_error()); 
saludos,

zsamer

Última edición por zsamer; 20/02/2006 a las 04:48
  #9 (permalink)  
Antiguo 21/02/2006, 06:12
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 4 meses
Puntos: 8
Cita:
Iniciado por zsamer
Gracias deadlykyo, finalmente funcionó bastante bien, tuve que hacer un pequeño cambio, utilicé HEAVING en vez de WHERE para abtener la experiencia laboral mas reciente. aquí dejo el query por si alguien le sirve para algo similar.

También acepto recomendaciones para mejorar o optimizar el SQL u otra forma de sql para hacer esto mismo.

Código PHP:
//para la busqueda dentro del query

    
$search_query  'WHERE ( ';
    
$search_query .= 'us.nombre_usuario LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'us.apaterno_usuario LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'us.amaterno_usuario LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_comuna_us LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_region_us LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_industria LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_sector LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_carrera LIKE "%' $palabra_clave '%" OR '
    
$search_query .= 'us.nombre_universidad LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'exp.cargo_empresa LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'exp.nombre_area_funcional LIKE "%' $palabra_clave '%" OR ';
    
$search_query .= 'exp.nombre_empresa LIKE "%' $palabra_clave '%" ';
    
$search_query .= ') ';

$result_busqueda_usuario mysql_query('SELECT
            us.id,
            us.username,
            us.nombre_usuario,
            us.apaterno_usuario,
            us.amaterno_usuario,
            us.image_name,
            us.thumb_name,
            us.objetivos,
            us.especialidades, 
            us.nombre_comuna_us,
            us.nombre_region_us,
            us.nombre_industria,
            us.nombre_sector,
            us.nombre_carrera,
            us.nombre_universidad,            
            exp.cargo_empresa,
            exp.nombre_empresa,
            exp.nombre_comuna_exp,
            exp.nombre_region_exp,
            exp.nombre_industria_exp,
            exp.nombre_sector_exp,
            exp.nombre_tipo_empresa,
            exp.nombre_tamano_empresa,
            exp.nombre_area_funcional FROM ' 
.'( SELECT     
            us2.id,
            us2.username,
            du.nombre_usuario, 
            du.apaterno_usuario,
            du.amaterno_usuario,
            du.image_name,
            du.thumb_name,
            pp.objetivos,
            pp.especialidades, 
            pc.nombre_comuna as nombre_comuna_us,
            pr.nombre_region as nombre_region_us,
            pi.nombre_industria,
            ps.nombre_sector,
            pcar.nombre_carrera,
            pun.nombre_universidad 
            FROM posters us2 '
.'LEFT JOIN prof_datos_usuarios du ON (us2.id=du.id_usuario) '
.'LEFT JOIN prof_comunas pc ON (pc.id_comuna=du.id_comuna) '
.'LEFT JOIN prof_regiones pr ON (pr.id_region=du.id_region) '
.'LEFT JOIN prof_profesion_usuarios pp ON (us2.id=pp.id_usuario) '
.'LEFT JOIN prof_industrias pi ON (pi.id_industria=pp.id_industria) '
.'LEFT JOIN prof_sectores ps ON (ps.id_sector=pp.id_sector) '
.'LEFT JOIN prof_carreras pcar ON (pcar.id_carrera=pp.id_carrera) '
.'LEFT JOIN prof_universidades pun ON (pun.id_universidad=pp.id_universidad) '
.'group by us2.id,us2.username ORDER BY us2.id) as us LEFT JOIN '            
.'(SELECT                 
            pel.id_usuario,
            pel.cargo_empresa,
            pel.nombre_empresa,
            pel.fecha_inicio,
            pc2.nombre_comuna as nombre_comuna_exp,
            pr2.nombre_region as nombre_region_exp,
            pi2.nombre_industria as nombre_industria_exp,
            ps2.nombre_sector as nombre_sector_exp,
            ptipe.nombre_tipo_empresa as nombre_tipo_empresa,
            pte.nombre_tamano_empresa as nombre_tamano_empresa,
            paf.nombre_area_funcional as nombre_area_funcional
            FROM prof_exp_laboral pel '
                    
.'LEFT JOIN prof_comunas pc2 ON (pc2.id_comuna=pel.id_comuna) '
.'LEFT JOIN prof_regiones pr2 ON (pr2.id_region=pel.id_region) '
.'LEFT JOIN prof_industrias pi2 ON (pi2.id_industria=pel.id_industria) '
.'LEFT JOIN prof_sectores ps2 ON (ps2.id_sector=pel.id_sector) '
.'LEFT JOIN prof_tipo_empresa ptipe ON (ptipe.id_tipo_empresa=pel.id_tipo_empresa) '
.'LEFT JOIN prof_tamano_empresa pte ON (pte.id_tamano_empresa=pel.id_tamano_empresa) '
.'LEFT JOIN prof_area_funcional paf ON (paf.id_area_funcional=pel.id_area_funcional) '
.'GROUP BY pel.id_usuario '
.'HAVING pel.fecha_inicio=MAX(pel.fecha_inicio) '
.') exp ON (exp.id_usuario=us.id) '    
$search_query .'order by us.id') or die (mysql_error()); 
¿hay alguna forma de optimizar el sql de mi respuesta anterior?

¿es posible hacer un SQL sin subquerys que muestre el mismo resultado?

gracias y salu2

zsamer
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 05:28.