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

Más de dos left join??

Estas en el tema de Más de dos left join?? en el foro de Mysql en Foros del Web. Hola a todos, Tengo la versión 4.0.27 de MySQL Estoy trabajando con las siguientes tables que estan relacionadas: CLIENTS (n,1) TE (1,n) OPERACIONS rel: OPERACIONS ...
  #1 (permalink)  
Antiguo 02/08/2008, 19:54
 
Fecha de Ingreso: agosto-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Más de dos left join??

Hola a todos,

Tengo la versión 4.0.27 de MySQL

Estoy trabajando con las siguientes tables que estan relacionadas:

CLIENTS (n,1) TE (1,n) OPERACIONS rel:
OPERACIONS (n,1) ENLLAÇ (1,n) FINQUES
CLIENTS (n,1) POSEIX (1,n) FINQUES

O sea en total 6 tablas (solo se utiliza en la consulta 4 de las tablas)

Y me gustaria hacer el siguiente a grandes rasgos. Con la funcion EXCEPT (MINUS) sería asi de facil:

SELECT DISTINCT finques.id_fi FROM finques,poseix,te WHERE te.operacions_numop='$numop' AND te.clients_nif=poseix.clients_nif AND poseix.finques_id_fi=finques.id_fi
EXCEPT
SELECT enllaç.id_fi FROM enllaç,finques WHERE enllaç.operacions_numop='$numop' AND enllaç.finques_id_fi=finques.id_fi

El problema que tengo con esta consulta es que la resta EXCEPT no se puede usar en mi versión, ni tan siquiera las subconsultas aunque el LEFT JOIN se puede usar para restar de la manera:

SELECT ... FROM ... LEFT JOIN ... ON ..... WHERE id IS NULL

He probado mil combinaciones para dar con la solución anterior incluso usando más de dos LEFT JOIN....

Estoy bastante rallado con el tema, además me es imposible cambiar de MySQL porque lo tengo en un hosting, aparte que ya esta en explotación.

Alguna solución??
  #2 (permalink)  
Antiguo 03/08/2008, 01:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Más de dos left join??

Taxiarcos,
creo entender cuál es el problema: tu versión de MySQL no permite subconsultas y tampoco incluye funciones como EXCEPT (MINUS). Pero para poder ayudarte necesitaríamos algo más de información sobre lo que quieres y no quieres, ilustrado si es posible con un par de ejemplos. Es decir, algo así como "quiero sacar todas las operaciones de clientes que tengan que ver con fincas..., pero fincas (operaciones o lo que sea) que no..." y si añades algún ejemplo concreto con un breve listado de datos, pienso que sería mucho mejor para que podamos ayudarte...
  #3 (permalink)  
Antiguo 03/08/2008, 05:57
 
Fecha de Ingreso: agosto-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Más de dos left join??

Si, gracias.

Os escribo lo que quiero decir lo más claramente posible:

Los CLIENTES pueden poseer una o más FINCAS y cada finca puede poseer uno o más CLIENTES, de aquí que exista la tabla POSEIX. De la misma manera un CLIENTE puede tener una o más OPERACIONES y cada operacion puede tener uno o más CLIENTES, de aquí que exista la tabla TE.

Entonces, lo que yo quiero, es una consulta donde de una OPERACION pueda seleccionar las FINCAS que tienen sus CLIENTES vinculados. Eso seria así:

(1) SELECT DISTINCT finques.id_fi FROM finques,poseix,te WHERE te.operacions_numop='$numop' AND te.clients_nif=poseix.clients_nif AND poseix.finques_id_fi=finques.id_fi

Además tambien existe una tabla (ENLLAÇ) que relaciona: OPERACIONES con FINCAS (n,n), las cuales yo controlo siempre que sea solo las que vienen del listado anterior.

(2) SELECT enllaç.id_fi FROM enllaç,finques WHERE enllaç.operacions_numop='$numop' AND enllaç.finques_id_fi=finques.id_fi

Lo que quiero en definitiva es que desde dentro de una operación me salga un listado de la consulta (1) menos las fincas que ya se han ido insertado en ENLLAÇ (2).

Este resultado que busco, en realidad es para rellenar un <html:SELECT> que me permite ir añadiendo las fincas (0,1 o más) de esos clientes vinculados a esta operación, pero que cada vez que inserte una no vuelva a aparecer en el <html:SELECT> para evitar incongruencias. De allí que quiera restar (1)-(2)

EJEMPLO:

TE
operacions_numop | clients_nif
----------------------------------------
08jl6 | 12345678C
08jl6 | 98765432A

POSEIX
clients_nif | finques_id_fi
----------------------------------
12345678C | 1
12345678C | 2
98765432A | 3

Resultado de la consulta 1
numop:08jl6
id_fi
-----
1
2
3

ENLLAÇ
operacions_numop | finques_id_fi
-------------------------------------------
08jl6 | 2

Resultado de lo que busco
numop:08jl6
id_fi
-----
1
3

No se si ahora he sido muy claro... GRACIAS DE NUEVO!!

Última edición por taxiarcos; 03/08/2008 a las 06:37
  #4 (permalink)  
Antiguo 03/08/2008, 08:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Más de dos left join??

Yo intentaría hacer la consulta que forma la lista de los id de fincas y los nombres así (he puesto un campo id en enllaç; esta es la idea):

SELECT f.id_fi, f.nombre, e.id FROM `finques` f LEFT JOIN enllaç e ON f.id_fi = e.finques_id_fi WHERE e.id IS NULL

Esta consulta te trae las fincas que no aparecen en enllaç
La consulta consiste en hacer un cruce de tablas con LEFT JOIN, que pone en principio todas las fincas a la izquierda y cruza con los datos de enllaç. Cuando alguna finca no tiene un id de enllaç al que poder referirla aparece NULL en el cruce en el campo id de enllaç. Ese NULL es el que nos sirve para buscar las fincas que no están en enllaç y por eso lo pongo en el WHERE...

Cuando selecciones en el selector el número de finca es cuando cargarás todos los clientes, etc.

A ver si la idea te sirve
  #5 (permalink)  
Antiguo 03/08/2008, 10:40
 
Fecha de Ingreso: agosto-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Más de dos left join??

Gracias Jurena,

De echo ahora lo tengo exactamente igual como me lo has dicho tu!! Y no me salen aquellas que ya habia seleccionado previamente, el problema es que tambien me salen aquellas fincas que no tienen ninguna relacion con esa operacion.

Lease fincas con relacion a un operacion concreta como:

SELECT DISTINCT finques.id_fi FROM finques,poseix,te WHERE te.operacions_numop='$numop' AND te.clients_nif=poseix.clients_nif AND poseix.finques_id_fi=finques.id_fi

Se que es un poco rebuscado lo que quiero
  #6 (permalink)  
Antiguo 03/08/2008, 12:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Más de dos left join??

He probado esto y parece que funciona;
SELECT f.nombre, p.finques_id_fi, t.operacions_numop, e.operacions_num_op FROM finques f INNER join poseix p ON p.finques_id_fi = f.id_fi INNER JOIN te t ON t.clients_nif = p.clients_nif LEFT JOIN enllaç e ON f.id_fi = e.finques_id_fi WHERE t.operacions_numop = "08jl6" AND e.operacions_num_op IS NULL

Cruza las tablas implicadas con INNER JOIN, y a la hora de comparar con los datos de enllaç empleamos un LEFT JOIN para poder usar los NULL

He usado las tablas finques, enllaç, te y poseix.

Última edición por jurena; 04/08/2008 a las 07:01
  #7 (permalink)  
Antiguo 03/08/2008, 16:11
 
Fecha de Ingreso: agosto-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Más de dos left join??

Jurena!! Eres lo más grande que ha parido Diós!!

Muchisimas gracias has dado directo en el clavo!!!

Podré cojer las vacaciones sin preocupaciones gracias de nuevo!!
  #8 (permalink)  
Antiguo 04/08/2008, 07:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Más de dos left join??

No había dado en el clavo, aunque creía que sí; hice algunas pruebas, como la de incluir en enllaç una entrada con un número de finca, pero con distinto número de operación, y me sacó esa finca de listado, aunque estaba relacionada con una operación distinta. He probado con esta sintaxis, y creo que ahora sí te funcionará bien:
SELECT f.nombre, p.finques_id_fi, t.operacions_numop, e.operacions_num_op
FROM finques f
INNER JOIN poseix p ON p.finques_id_fi = f.id_fi
INNER JOIN te t ON t.clients_nif = p.clients_nif
LEFT JOIN enllaç e ON f.id_fi = e.finques_id_fi
AND t.operacions_numop = e.operacions_num_op
WHERE t.operacions_numop = "08jl6"
AND e.operacions_num_op IS NULL

Prueba introduciendo entradas que pudieran causarte algún problema. Este es el único modo de saber si te funcionará en todos los casos.

Feliz verano en cualquier caso.

Última edición por jurena; 04/08/2008 a las 08:16
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 05:53.