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

Problemas en base no relacional

Estas en el tema de Problemas en base no relacional en el foro de Mysql en Foros del Web. Hola estimados, me dirijo a ustedes con una gran interrogante, resulta que en mi lugar de trabajo, existe una base de datos que no esta ...
  #1 (permalink)  
Antiguo 25/08/2015, 11:23
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 10 años, 1 mes
Puntos: 1
Exclamación Problemas en base no relacional

Hola estimados, me dirijo a ustedes con una gran interrogante, resulta que en mi lugar de trabajo, existe una base de datos que no esta relacionada entre si, pero que si respeta esa lógica a nivel de programación PHP. Este problema me ha generado varios problemas al momento de construir consultas para mostrar algunos datos en especifico, pero el problema que actualmente tengo me supero. Les dejo info para que me puedan ayudar o darme un poco de guia.

Tengo 6 tablas a las cuales iré a consultar

Afiliado
RecepcionReembolso
SucursalSermecoop
UsuarioSistema
Empresa
Estado

siendo la tabla {RecepcionReembolso} la que consume a las otras 5, esta tabla tiene un problema "al menos para mi", tiene dos campos[RecReeIdEjecutivoLiq] y [RecReeIdUsuario] que le hacen referencia a uno solo de la tabla {UsuarioSistema}[UsuSisId], aquí nace mi problema, porque al realizar el JOIN en el campo [RecReeIdEjecutivoLiq] de la tabla {RecepcionReembolso} esta me devuelve un tipo de data, pero al cruzar el campo [RecReeIdUsuario] de la tabla {RecepcionReembolso} con el campo [UsuSisId] de la tabla {UsuarioSistema} esta me entrega otro tipo de data, lo cual hace que la información que muestro no es fidedigna y no se como solucionarlo. Adjunto las consultas que estoy utilizando:

Código MySQL:
Ver original
  1.     r.RecReeIdUsuario,    
  2.     CONCAT(a.AfiNombres, ' ', a.AfiApPaterno) Nombre,
  3.     r.RecReeIdEstadoRecepcionReembolso,
  4.     r.RecReeNumeroReembolso,
  5.     r.RecReeCopago,
  6.     r.RecReeNumDoctos,
  7.     r.RecReeIdTipoPrestacion,
  8.     r.RecReeFecha,
  9.     r.RecReeIdEjecutivoLiq,
  10.     REPLACE(s.SucSerNombre, 'ó', 'o') AS SucSerNombre,
  11.     s.SucSerId,
  12.     IF(r.RecReeIdEjecutivoLiq = 0,'SIN ASIGNAR',CONCAT(u.UsuSisNombre,' ',u.UsuSisApPaterno)) nombre_user
  13.   FROM Afiliado a    
  14.   INNER JOIN RecepcionReembolso r ON r.RecReeIdAfiliado = a.AfiId
  15.   INNER JOIN UsuarioSistema u ON r.RecReeIdUsuario = u.UsuSisId
  16.   INNER JOIN SucursalSermecoop s ON s.SucSerId = u.UsuSisIdSucursalSermecoop
  17.   INNER JOIN Empresa e ON e.EmpId = a.AfiIdEmpresa
  18.   INNER JOIN Estado t ON t.EstId = e.EmpIdEstado  
  19.   WHERE r.RecReeFecha BETWEEN '2015-08-20' AND '2015-08-20'

Como pueden ver no es una consulta de complejidad alta, pero me ha tenido bien aproblemado este tema, porque dependiendo del campo que utilice en el join [ INNER JOIN UsuarioSistema u ON r.RecReeIdUsuario = u.UsuSisId]. Este me cambia la información de las sucursales y de los usuarios. Espero me puedan dar una manito o guiar para solucionar este problema. Muchas gracias
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #2 (permalink)  
Antiguo 25/08/2015, 13:35
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Problemas en base no relacional

Hola David_Carrera_G:

Veamos si entendí correctamente el problema. Lo que tienes es una Doble Referencia a una misma tabla, por lo tanto, lo que tienes que hacer es un DOBLE JOIN, utilizando un alias. Supongamos que tienes estas dos tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id_1 | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+------+
  13. | id_a | id_b |
  14. +------+------+
  15. |    1 |    1 |
  16. |    2 |    3 |
  17. |    3 |    1 |
  18. +------+------+
  19. 3 rows in set (0.00 sec)

La tabla 2 contiene dos campos que hacen referencia a la tabla1, si quisieras obtener la DESCRIPCIÓN de esos campos, puedes hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT tabla2.id_a, TA.descripcion, tabla2.id_b, TB.descripcion
  2.     -> FROM tabla2
  3.     -> INNER JOIN tabla1 TA ON TA.id_1 = Tabla2.id_a
  4.     -> INNER JOIN tabla1 TB ON TB.id_1 = Tabla2.id_b;
  5. +------+-------------+------+-------------+
  6. | id_a | descripcion | id_b | descripcion |
  7. +------+-------------+------+-------------+
  8. |    1 | uno         |    1 | uno         |
  9. |    3 | tres        |    1 | uno         |
  10. |    2 | dos         |    3 | tres        |
  11. +------+-------------+------+-------------+
  12. 3 rows in set (0.01 sec)

Observa que cada JOIN utiliza un alias distinto (TA, TB) aunque hacen referencia a la misma tabla, en el JOIN utilizas cada uno de los campos que hacen referencia a este campo por separado.

Haz la prueba y nos comentas.

Saludos
Leo

Última edición por leonardo_josue; 25/08/2015 a las 13:44
  #3 (permalink)  
Antiguo 26/08/2015, 09:20
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 10 años, 1 mes
Puntos: 1
Respuesta: Problemas en base no relacional

Estimado muchas gracias por tu respuesta, utilice el concepto que mencionas, pero aún me da problema de los datos, lo que hice como solución parche mientras tanto. Cree dos tablas temporales cada una con el [ INNER JOIN UsuarioSistema u ON r.RecReeIdUsuario = u.UsuSisId] y la otra con el [ INNER JOIN UsuarioSistema u ON r.RecReeIdEjecutivoLiq= u.UsuSisId]. Luego cruzo sus ID y obtengo la información que necesito mediante una consulta a las dos tablas temporales que cree. Que piensas sobre esta solución, se que no es lo mas optimo, pero me ayudo a salir del incendio.
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #4 (permalink)  
Antiguo 28/08/2015, 06:39
 
Fecha de Ingreso: abril-2015
Ubicación: Castelldefels
Mensajes: 76
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Problemas en base no relacional

Hola David,

creo haber entendido el problema. Yo tambien lo tuve hace un tiempo, y la solución por la que opté, sin generar más consultas de las necesarias, es crear ese mismo campo en la tabla usuario dos veces.

Me explico:

en la tabla de usuario crea dos campos: El campo de usuario USususId y el campo UsuSis1Id (ambos campos contienen el mismo dato) el id de usuario.

Lo que ocurre es que cuando haces la consulta con el JOIN una tabla la comparas con el dato UsusID y la otra con el dato Usus1ID, ambas tiene el mismo valor por lo que la consulta saldrá correcta.

Espero que te sirva, es tan solo una idea
  #5 (permalink)  
Antiguo 28/08/2015, 09:19
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 10 años, 1 mes
Puntos: 1
Respuesta: Problemas en base no relacional

Cita:
Iniciado por jlusc98 Ver Mensaje
Hola David,

creo haber entendido el problema. Yo tambien lo tuve hace un tiempo, y la solución por la que opté, sin generar más consultas de las necesarias, es crear ese mismo campo en la tabla usuario dos veces.

Me explico:

en la tabla de usuario crea dos campos: El campo de usuario USususId y el campo UsuSis1Id (ambos campos contienen el mismo dato) el id de usuario.

Lo que ocurre es que cuando haces la consulta con el JOIN una tabla la comparas con el dato UsusID y la otra con el dato Usus1ID, ambas tiene el mismo valor por lo que la consulta saldrá correcta.

Espero que te sirva, es tan solo una idea
Gracias por responder estimado, pero al principio de mi problema, pensé en hacer lo mismo, pero no tengo acceso para modificar datos en las tablas, eso me coarto mis posibilidades por eso fue que tuve que inventar una solución no tan optima, pero funcional.
__________________
David Carrera González
Santiago de Chile
Analista de base de datos

Etiquetas: consula, sql
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 07:46.