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

Consulta algo especial

Estas en el tema de Consulta algo especial en el foro de Mysql en Foros del Web. Hola a todos, tenia rato que no pasaba por aqui, hoy respondi algunos temas de los que se esperando les sirva mi comentario. Hoy vengo ...
  #1 (permalink)  
Antiguo 29/03/2012, 18:38
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 10 años, 7 meses
Puntos: 3
Consulta algo especial

Hola a todos, tenia rato que no pasaba por aqui, hoy respondi algunos temas de los que se esperando les sirva mi comentario.

Hoy vengo pidiendo ayuda de nuevo, no se mucho de mysql y me estoy viendo en la necesidad xD de realizar una consulta de la siguiente forma:

tengo las siguientes tablas

experiencia (ex_id,ex_descr)
habilidades(ha_id,ha_descr)
idiomas(id_id,id_descr)
personas(pe_id,pe_nombre,ci_id)
ciudad(ci_id,ci_descr)
personaexp(pe_id,ex_id)
personahab(pe_id,ha_id)
personaidi(pe_id,id_id)

las tres ultimas permiten a una persona tener mas de una experiencia, habilidad o idioma, ciudad tiene una cada persona.

supongamos los siguientes datos de las tablas

experiencia:
1,'contador'
2,'albañil'
3,'tenico automotriz'

habilidades:
1,'trabajo bajo presion'
2,'buen trato'

idiomas:
1,'español'
2,'ingles'
3,'frances'

personas:
1,'juan',2
2,'luis',1
3,'jorge',1

personaexp (recuerden son ids):
1,2
1,3
2,1
3,3

personahab:
1,1
3,1
3,2

personaidi:
1,1

El asunto esta en que se debe ordenar las personas a partir de cual tenga mas coincidencias en las tres ultimas tablas, para el ejemplo necesitaria que sucediera algo asi,

pe_id=1,pe_descr='juan'
pe_id=3,pe_descr='jorge'
pe_id=2,pe_descr='luis'

juan sale en las tres tablas
jorge en dos
luis en una

en caso de que no saliera en ninguna, no deberia aparecer en el resultado de la consulta. A esto le agrego que hay filtros, es decir, se va a buscar por sexo, experiencia y/o idioma, aunque supongo que teniendo la consulta anterior, seria nada mas poner condiciones en el where para que filtre. Estaria genial que ademas de ordenarlos asi, si hubiera 4 que salen en las 3 tablas, se checara ahora de las tablas, el que tuviera mas registros para ordenarlos de mayor a menor numero de registros (es mucho pedir, lo se xD)

Igual y la consulta esta sencilla pero la verdad le he dado vueltas al asunto y no tengo idea de como hacer que aparezcan asi, si todo estuviera en una misma tabla seria mas sencillo, pero desde tablas separadas no tengo idea.

Gracias y disculpen la molestia.
  #2 (permalink)  
Antiguo 30/03/2012, 07:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: Consulta algo especial

Código MySQL:
Ver original
  1. SELECT pe_id,count(*) FROM personaexp GROUP BY pe_id;

Esto te da el numero de apariciones de una persona en "personaexp"


Código MySQL:
Ver original
  1. SELECT p.pe_id,p.pe_nombre
  2. FROM personas p
  3.      (SELECT pe_id,count(*) as apariciones FROM personaexp GROUP BY pe_id
  4.       UNION ALL
  5.       SELECT pe_id,count(*) as apariciones FROM personahab GROUP BY pe_id
  6.       UNION ALL
  7.       SELECT pe_id,count(*) as apariciones FROM personaidi GROUP BY pe_id) as Sbc
  8.     ON p.pe_id=Sbc.pe_id
  9. GROUP BY p.pe_id,p.pe_nombre
  10. ORDER BY SUM(Sbc.apariciones) DESC;

Era esto?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 30/03/2012, 11:17
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Consulta algo especial

Cita:
Iniciado por quimfv Ver Mensaje
Código MySQL:
Ver original
  1. SELECT pe_id,count(*) FROM personaexp GROUP BY pe_id;

Esto te da el numero de apariciones de una persona en "personaexp"


Código MySQL:
Ver original
  1. SELECT p.pe_id,p.pe_nombre
  2. FROM personas p
  3.      (SELECT pe_id,count(*) as apariciones FROM personaexp GROUP BY pe_id
  4.       UNION ALL
  5.       SELECT pe_id,count(*) as apariciones FROM personahab GROUP BY pe_id
  6.       UNION ALL
  7.       SELECT pe_id,count(*) as apariciones FROM personaidi GROUP BY pe_id) as Sbc
  8.     ON p.pe_id=Sbc.pe_id
  9. GROUP BY p.pe_id,p.pe_nombre
  10. ORDER BY SUM(Sbc.apariciones) DESC;

Era esto?

Tu codigo funciona perfecto si solo quiero ver quien tiene mas registros entre las 3 tablas, pero antes de eso, necesito ordenar dependiendo de en que tablas salga la persona, por ejemplo

pedro sale en la tabla personaexp
juan sale en la tabla personahab y personaexp
luis sale en la tabla personaidi, personaexp

entonces el orden para mostrar el pe_id y pe_nombre seria
juan
luis
pedro

todo esto independientemente de cuantos registros de juan, pedro o luis haya.

si luis tambien estuviera en la tabla personahab, saldria en primer lugar y juan en segundo. Y de esto hay muchas variantes pues tambien habra filtros que deberan traerse los datos de las personas que coincidan con esos filtros.

Hacer todo lo que necesito en una sola consulta a mi no se me hace sencillo, obvio alguien con mas experiencia que yo en mysql puede que la saque igual y en un dia de quebrarse la cabeza, yo llevo 3 dias y nomas no logro lo que necesito, minimo lo de ordenar el pe_id y pe_nombre a partir de en cuantas tablas se encontro a la persona y ordenar de la que se encuentra en las 3, en 2 o en 1.

Gracias y pues, dejo un poco pendiente esto por que me salio otra chamba que es para mañana.

Última edición por LOD_Fredy; 30/03/2012 a las 16:41
  #4 (permalink)  
Antiguo 04/04/2012, 14:32
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Consulta algo especial

Mira, esta es la consulta que se me ocurre para ordenar a las personas segun el numero de tablas en que aparezcan.

Código MySQL:
Ver original
  1. SELECT PE.pe_id,pe_nombre,pe_ape1,pe_ape2,pe_fenac,pe_sexo,EC.ec_descr 'Edo Civil',pe_nacion,pe_email1,pe_email2,pe_tel1,pe_tel2,pe_tel3,pe_tel4,pe_dircallenum,pe_colonia,CI.ci_descr,pe_liga
  2. ,IF(PX.px_id<>"",1,0),IF(PS.ps_id<>"",1,0),IF(PH.ph_id<>"",1,0),IF(PI.pi_id<>"",1,0)
  3. FROM personas PE
  4. INNER JOIN estadosciviles AS EC ON EC.`ec_id`=Pe.`ec_id`
  5. INNER JOIN ciudades AS CI ON CI.ci_id=Pe.`ci_id`
  6. LEFT JOIN personaeexperiencia AS PX ON PX.`pe_id`=Pe.`pe_id`
  7. LEFT JOIN personaescolaridad AS PS ON Ps.pe_id=Pe.`pe_id`
  8. LEFT JOIN personahabilidad AS PH ON Ph.`pe_id`=Pe.`pe_id`
  9. LEFT JOIN personaidioma AS PI ON PI.`pe_id`=Pe.pe_id
  10. LEFT JOIN experiencia AS EX ON EX.ex_id=Px.`ex_id`
  11. LEFT JOIN escolaridad AS ES ON ES.`es_id`=PS.`es_id`
  12. GROUP BY Pe.`pe_id` ORDER BY IF(PX.px_id<>"",1,0) DESC,IF(PS.ps_id<>"",1,0) DESC, IF(PH.ph_id<>"",1,0) DESC,IF(PI.pi_id<>"",1,0) DESC

Lo ideal seria poder mezclar esa consulta con la tuya para obtener la consulta perfecta ya que la mia simplemente ordena del que tiene los 4 1 (un 1 por cada tabla) al que tiene 3, 2, 1 pero si dentro de los que tienen 4 hay uno que tiene 3 registros de la tabla 1 por ejemplo y otro tiene 2, los podria ordenar mal.

Voy a usar mi consulta por mientras ya que es lo principal ahorita, pero como te digo, juntar tu consulta con la mia seria lo ideal.

Gracias.
  #5 (permalink)  
Antiguo 05/04/2012, 03:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: Consulta algo especial

Código MySQL:
Ver original
  1. SELECT p.pe_id,
  2. p.pe_nombre,
  3. SUM(Sbc.tablas) as NTablas,
  4. SUM(Sbc.apariciones) as NApariciones
  5. FROM personas p
  6.      (SELECT pe_id,
  7.        if(count(*)>=1,1,0) as tablas,
  8.        count(*) as apariciones
  9. FROM personaexp GROUP BY pe_id
  10.       UNION ALL
  11.       SELECT pe_id,
  12.       if(count(*)>=1,1,0) as tablas,
  13.       count(*) as apariciones
  14. FROM personahab GROUP BY pe_id
  15.       UNION ALL
  16.       SELECT pe_id,
  17.       if(count(*)>=1,1,0) as tablas,
  18.       count(*) as apariciones
  19. FROM personaidi GROUP BY pe_id) as Sbc
  20.     ON p.pe_id=Sbc.pe_id
  21. GROUP BY p.pe_id,p.pe_nombre
  22. ORDER BY NTablas DESC,NApariciones DESC;

Era esto....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 05/04/2012 a las 04:06

Etiquetas: especial, registros, sql, tabla
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 13:03.