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

Un if adentro de un left join

Estas en el tema de Un if adentro de un left join en el foro de Mysql en Foros del Web. Tengo un problema y estuve tratando de buscar info pero no hay caso, encuentro algunos casos medios parecidos pero nada. El planteo es este: Tabla ...
  #1 (permalink)  
Antiguo 14/06/2012, 08:50
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 4
Antigüedad: 12 años, 7 meses
Puntos: 0
Pregunta Un if adentro de un left join

Tengo un problema y estuve tratando de buscar info pero no hay caso, encuentro algunos casos medios parecidos pero nada.
El planteo es este:

Tabla principal llamada leyes_relacion con 3 campos que son:

ley_id
relacion_id
tipo_relacion

en el primero va el id de la ley, en el segundo el id de la relacion y en el tercero el tipo de la relacion, que puede tener 3 valores 1 si es jurisprudencia, 2 si es doctrina, 3 si es ley. Mi problema esta aca, voy a tratar de plasmarlo en este ejemplo de consulta:

SELECT * FROM leyes_relacion
(if tipo_relacion == 1 then LEFT JOIN jurisprudencia ON jurisprudencia_id = tipo_relacion )
(if tipo_relacion == 2 then LEFT JOIN doctrina ON doctrina _id = tipo_relacion )
(if tipo_relacion == 3 then LEFT JOIN leyes ON leyes _id = tipo_relacion )
WHERE ley_id = 1255

no se si es posible esto dentro de la tabla relaciones el id de la ley que estoy buscando esta muchas veces ya que las relaciones son varios documentos con la ley elegida en este caso la 1255. Es decir puede estar relacionada con 3 doctrinas, 2 jurisprudencias y 4 leyes.

Espero se haya alguna solucion para esto, sino la otra es hacerlo en dos consultas, pero no es la idea.
Muchas gracias.
  #2 (permalink)  
Antiguo 14/06/2012, 09:18
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Un if adentro de un left join

Hola dattar:

No me queda claro cómo tienes organizada tu información. Desde mi punto de vista tienes un problema grave de modelado de datos. No puedes tener una llave foránea que pueda hacer referencia a más de una tabla... En tu caso podrías modelar tus tablas con dos enfoques distintos, una sería colocando tres campos en tu tabla leyes_relacion donde cada campo haga referencia a una tabla (jurisprudencia, leyes, doctrinas) o convertir estas tres tablas en una sola, incluyendo un atributo TIPO donde especifiques si es justamente jurisprudencia, ley o doctrina.

Si te es posible, modifica tu modelo de BD y evitarás más problemas como este en el futuro. Sin embargo como es posible que no puedas modificar tu modelo de BD se me ocurren dos ideas, aunque no sé si funcionen...

Una sería hacer lo siguiente:

Código MySQL:
Ver original
  1. SELECT * FROM leyes_relacion
  2.   LEFT JOIN jurisprudencia
  3.     ON jurisprudencia_id = tipo_relacion AND tipo_relacion = 1
  4.   LEFT JOIN doctrina
  5.     ON doctrina _id = tipo_relacion AND tipo_relacion = 2
  6.   LEFT JOIN leyes
  7.     ON leyes _id = tipo_relacion AND tipo_relacion = 3
  8. WHERE ley_id = 1255

o
Código MySQL:
Ver original
  1. SELECT * FROM leyes_relacion
  2.   LEFT JOIN jurisprudencia
  3.   ON jurisprudencia_id = tipo_relacion
  4.   WHERE ley_id = 1255 AND tipo_relacion = 1
  5. SELECT * FROM leyes_relacion
  6.   LEFT JOIN doctrina  
  7.   ON doctrina _id = tipo_relacion
  8.   WHERE ley_id = 1255 AND tipo_relacion = 2
  9. SELECT * FROM leyes_relacion
  10.   LEFT JOIN leyes
  11.   ON leyes _id = tipo_relacion
  12.   WHERE ley_id = 1255 AND tipo_relacion = 3

Prueba alguna de las dos opciones a ver si te regresa el resultado que estás esperando, sino es así sería conveniente que nos pongas algunos datos de ejemplo de cada una de tus tablas para hacerte una nueva propuesta.

Saludos
Leo.
  #3 (permalink)  
Antiguo 14/06/2012, 09:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Un if adentro de un left join

Bueno, hoy Leo se me ha anticipado , por lo que no puedo añadir mucho más, salvo recomendarte que modifiques la base de datos antes de seguir con el proyecto, de modo de atenerte a los fundamentos de las bases de datos relacionales. De ese modo evitarás los actuales problemas de inconsistencia y falta de integridad referencial que tienes.

Para que conste: Lo que has planteado como modelado, "compartiendo" una FK entre varias tablas, te hubiera hecho reprobar Base de Datos I sin que el profesor tuviera necesidad de seguir leyendo el examen.
__________________
¿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 14/06/2012, 09:49
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 4
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Un if adentro de un left join

Claro porque trate de resumirlo, en realidad tengro 3 tablas de datos:
Leyes (que se relaciona con dos mas tipo de norma y emisor)
Jurisprudencia (se relaciona con tribunal)
Doctrina (se relaciona con autor y nota al fallo)

Entonces, una vez que tengo esas 3 tablas lo que hice fue crear la tabla en donde se relacionan, mejor dicho, se citan, por ejemplo dentro de una ley puedo relacionarla o citar como "Documentos relacionados o Documentos parecidos".
Hice una tabla de relaciones para cada tabla.

relacion_docu_doctrina (campos: id_doctrina, id_relacion, tipo_relacion)
relacion_docu_juris (campos: id_jurisprudencia, id_relacion, tipo_relacion)
relacion_docu_leyes (campos: id_ley, id_relacion, tipo_relacion)

Entonces cuando estoy dentro de una doctrina y quiero buscar todas las relaciones me gustaria poder hacer un if antes de hacer el LEFT JOIN a la tabla que me indique el tipo de relacion. 1 si es jurisprudencia, 2 si es doctrina o 3 si es ley.

Ustedes dicen que tendria que cambiarlo, el tema es como. Como ordeno eso???
Me estoy quemando.
Gracias por las respuestas, creo que van de diez voy a probarlas.
Son grosos sepanlo
  #5 (permalink)  
Antiguo 14/06/2012, 12:20
 
Fecha de Ingreso: junio-2010
Mensajes: 23
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Un if adentro de un left join

Hola, ando necesitando algo silimar, lo mas seca que llegue fue

Código PHP:
SELECT FROM oficina INNER JOIN personas ON personas.id oficina.idt AND personas.titulo '123' AND oficina.type '0' INNER JOIN empresas ON empresas.id oficina.idt AND empresas.titulo '123' AND oficina.type '1'  WHERE  oficina.oficina LIKE 'D1' 
Esto me funciona perfectamente si solo uso un inner join, pero con los dos no...
Hay forma de hacer algo como un OR, entre los dos.... ??

Es asi, tengo tres tablas, una con el nombre de la 'oficina', que seria D1, y los pisos estan dados por el 'titulo', que se encuentran en tablas separadas segun si es la oficina de una empresa o una persona, el 'type' 0 indica que es una persona, 1 empresa....

Necesito poder seleccionar todas las oficinas, tanto las de las empresas como las de las personas en una sola consulta, me he pasado horas probando y nada no logro armar la consulta para hacer esto u.u

Porfavor cualquier ayuda es argadecida!
  #6 (permalink)  
Antiguo 14/06/2012, 13:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Un if adentro de un left join

Hola alexx855:

Antes que nada... No es correcto que utilices un post ajeno para exponer una pregunta, no importa que sea un tema muy parecido. Lo que tienes que hacer es abrir tu propio post y si lo deseas poner la liga hacia la pregunta semejante para ponernos en contexto... Mucho ojo para la siguiente:

Segundo, espero que al igual que dattar te des cuenta que el modelo de datos que tienes no es el "adecuado" por no decir lo que estoy pensando . Si no quieres tener problemas en el futuro cambia tu modelo y evita problemas...

Tercero, ahora si con respecto a tu pregunta... La manera en que lo estás intentando nunca te dará resultados, pues estás pretendiendo que tu campo oficina.type sea a la vez 0 y 1, cosa que resulta imposible... Si quiere utilizar INNER JOIN deberás hacer un UNION, es decir, como si fueran dos consultas o cambiar por LEFT JOIN e inténtalo como le propuse a dattar... Si tienes problemas ABRE UN NUEVO POST y nos comentas.

Saludos
Leo.

Etiquetas: anidar, inner-join, join, left
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 20:26.