Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Mysql (http://www.forosdelweb.com/f86/)
-   -   Problema consulta con Subquery y Join entre dos tablas (http://www.forosdelweb.com/f86/problema-consulta-con-subquery-join-entre-dos-tablas-370789/)

zsamer 13/02/2006 13:44

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

zsamer 13/02/2006 18:08

se entiende el problema?
alguna ayuda?

zsamer 15/02/2006 09:52

:molesto: ninguna ayuda?

deadlykyo 15/02/2006 12:59

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

zsamer 15/02/2006 15:51

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

deadlykyo 17/02/2006 09:16

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

zsamer 19/02/2006 17:31

muchas gracias lo voy a probar y te cuento.

un abrazo

zsamer

zsamer 19/02/2006 20:32

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

zsamer 21/02/2006 06:12

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


La zona horaria es GMT -6. Ahora son las 10:33.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.