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

[SOLUCIONADO] Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una de ellas

Estas en el tema de Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una de ellas en el foro de Mysql en Foros del Web. Hola chic@s! estoy tratando de realizar una consulta pero no tengo idea de como hacerlo les explico: tengo 2 tablas una empleados y otra grupo ...
  #1 (permalink)  
Antiguo 15/08/2013, 09:51
p11
 
Fecha de Ingreso: agosto-2013
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una de ellas

Hola chic@s!
estoy tratando de realizar una consulta pero no tengo idea de como hacerlo les explico:
tengo 2 tablas una empleados y otra grupo de empleados,
la tabla empleados tine campos: id, empleado,salario, la tabla grupo de empleados tiene id,grupo,empleados,
lo que necesito hacer es relacionar al empleado al grupo al que pertenece; pero no tengo idea de como hacerlo ya que la la tabla se llena de la siguiente manera.

id---empleado---salario
1---juan---------3
2---pepe--------4
3---pablo--------5


id-----grupo-----empleados
1------dba------juan,pablo,beto
2-----backend---pepe,luis,daniel
3-----diseño----sam,us,ux

como puedo hacer el join para que salga
juan es dba su salario es 3
pablo dba su salario 5
pepe es backedn su salario es 4 y asi sucesivamente

de antemano gracias por su ayuda

P.D. la estructura de la tabla no la realice yo, solo tengo que apegarme a ella
  #2 (permalink)  
Antiguo 15/08/2013, 10:21
 
Fecha de Ingreso: mayo-2011
Mensajes: 44
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

La manera seria virtualmente facil, ya que haces un inner join como cualquier otro, pero en la clausula de ON del inner join pones un like para que evalue si el nombre del empleado se encuentra en alguna parte del string de empleados de la otra tabla

Código SQL:
Ver original
  1. ON grupos.empleados LIKE CONCAT('%',empleados.empleado,'%')

nada mas que esto tiene un problema claro esta, si el nombre dentro del de otro empreado, por ejemplo Alexis,Alex
ya que al hacer la consulta por Alexis no hay problema, solo hay uno, pero si la haces por Alex, aparecerian dos veces, ya que Alexis contiene Alex dentro

En este caso no se si podrias cambiar el delimitador que divide cada empleado para que este tambien al principio y al final, y asi de esta manera si podrias poner una consulta como esta para que sea 100% Segura

Código SQL:
Ver original
  1. ON grupos.empleados LIKE CONCAT('%,',empleados.empleado,',%')
  #3 (permalink)  
Antiguo 15/08/2013, 10:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

Por lo pronto, si la tabla "grupo de empleados" tiene campos multivaluados como lo muestras:
Cita:
id-----grupo-----empleados
1------dba------juan,pablo,beto
2-----backend---pepe,luis,daniel
3-----diseño----sam,us,ux
Lo que tienes es un pésimo diseño de datos. Esos campos multivaluados están totalmente prohibidos en las bases de datos relacionales.
Existen do scasos posibles para tu esquema:
1) El empelado pertenece a un único grupo. Se resuelve colocando en el registro del empleado un atributo FK de la tabla Grupos (relación 1:N).
2) Un empleado puede pertenecer a más de un grupo. Se requiere sí o sí una nueva tabla que maneje la relación entre empelados y grupos (relación N:N) donde cada empleado aparecerá una vez relacionado con cada grupo al que pertenece:
Tabla Empleado
Cita:
id_empleado nombre
1 juan
2 pablo
3 beto
4 pepe
5 luis
6 daniel
7 sam
8 us
9 ux
Tabla Grupo
Cita:
id_grupo nombre_grupo
1 DBA
2 BACKEND
3 DISEÑO
Tabla Empleado_grupo
Cita:
id _grupo id_empleado
1 1
1 2
1 3
2 4
2 5
2 6
3 7
3 8
3 9
De ese modo se construye la relación, y la consulta para obtener los datos que quieres se vuelve extremadamente fácil de escribir.
De lo contrario tendrás los problemas que tienes ahora... y peores.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 15/08/2013, 10:57
p11
 
Fecha de Ingreso: agosto-2013
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

Gracias josefo225 lo intentare y aviso el resultado
  #5 (permalink)  
Antiguo 15/08/2013, 11:04
p11
 
Fecha de Ingreso: agosto-2013
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por lo pronto, si la tabla "grupo de empleados" tiene campos multivaluados como lo muestras:

Lo que tienes es un pésimo diseño de datos. Esos campos multivaluados están totalmente prohibidos en las bases de datos relacionales.
Existen do scasos posibles para tu esquema:
1) El empelado pertenece a un único grupo. Se resuelve colocando en el registro del empleado un atributo FK de la tabla Grupos (relación 1:N).
2) Un empleado puede pertenecer a más de un grupo. Se requiere sí o sí una nueva tabla que maneje la relación entre empelados y grupos (relación N:N) donde cada empleado aparecerá una vez relacionado con cada grupo al que pertenece:
Tabla Empleado

Tabla Grupo


Tabla Empleado_grupo


De ese modo se construye la relación, y la consulta para obtener los datos que quieres se vuelve extremadamente fácil de escribir.
De lo contrario tendrás los problemas que tienes ahora... y peores.
Tienes toda la razón en tus comentarios y se te agradece, sin embargo como mencioné el diseño de la bd no lo hice yo y lo único que queda es apegarme, pero cuando haga mi propio diseño tomaré muy en cuenta tus sugerencias saludos.
  #6 (permalink)  
Antiguo 15/08/2013, 13:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

En ese contexto, la única solución práctica es usar FIND_IN_SET(), que te permite evaluar cadenas de texto que contienen valores separados internamente por comas. Pero para poder lograrlo, como no tienes una relación declarada entre ambas tablas (no existe una FK), deberás hacer un producto cartesiano, lo que termina siendo bastante espantoso....
¿No puedes tratar de cambiar la estructura? ¿Hay alguien a quien se pueda convencer?
De lo contrario solo te quedaría iterar por programación y SQL... y es peor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 16/08/2013, 09:29
 
Fecha de Ingreso: mayo-2011
Mensajes: 44
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

Buenas p11
Gnzsoloyo tiene razon con la funcion FIND_IN_SET() tambien podria servir, ya que esta para evaluar los campos set que es similar a lo que tienes, pero no la recomende por la falta de certeza de si funciona con un campo que no es set, como imagino que es tu caso

en este caso esa funcion podria remplazar el like

De igual manera gnzsoloyo tiene razon tambien en que seria genial si pudieras arreglar el modelo entidad relacion para que quedara de manera correcta, pero entiendo que muchas veces esto es imposible, ya que uno aveces ni siquiera le corresponde esa funcion, solo hacer las consultas con lo que se tiene y ya, no se puede hacer mas
  #8 (permalink)  
Antiguo 16/08/2013, 09:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

Cita:
si funciona con un campo que no es set
Para aclara, la función FIND_IN_SET() no se refiere a campos set, sino a buscar en un "set" o conjunto de valores que están en una misma cadena de texto. La única exigencia es que tales valores deben separados por comas dentro de la cadena:
"1, d, 3, 4"
No tiene absolutamente nada que ver con una columna de tipo SET.

Por otro lado, el uso de LIKE será errático por su propia definición (todo lo que contenga algo como '%xxx%'), porque no diferencia palabras completas de fragmentarias, y de todos modos no resuelve un problema: El que no existe una relación dada entre ambas tablas.
En ese contexto, para usarlo también debes hacer un producto cartesiano, o bien iterarlo en N consultas desde programación, con lo que sería más eficiente usar FIND_IN_SET(), ya que no tiene la ambigüedad de LIKE para este caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 19/08/2013, 17:45
p11
 
Fecha de Ingreso: agosto-2013
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

Cita:
Iniciado por josefo225 Ver Mensaje
La manera seria virtualmente facil, ya que haces un inner join como cualquier otro, pero en la clausula de ON del inner join pones un like para que evalue si el nombre del empleado se encuentra en alguna parte del string de empleados de la otra tabla

Código SQL:
Ver original
  1. ON grupos.empleados LIKE CONCAT('%',empleados.empleado,'%')

nada mas que esto tiene un problema claro esta, si el nombre dentro del de otro empreado, por ejemplo Alexis,Alex
ya que al hacer la consulta por Alexis no hay problema, solo hay uno, pero si la haces por Alex, aparecerian dos veces, ya que Alexis contiene Alex dentro

En este caso no se si podrias cambiar el delimitador que divide cada empleado para que este tambien al principio y al final, y asi de esta manera si podrias poner una consulta como esta para que sea 100% Segura

Código SQL:
Ver original
  1. ON grupos.empleados LIKE CONCAT('%,',empleados.empleado,',%')


Gracias amigo me sirvió de mucho. saludos
  #10 (permalink)  
Antiguo 20/08/2013, 08:31
 
Fecha de Ingreso: mayo-2011
Mensajes: 44
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Se puede hacer una consulta en 2 tablas realizando una busqueda sobre una

no hay problema, con mucho gusto

Etiquetas: select
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 11:28.