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

Multiples fk

Estas en el tema de Multiples fk en el foro de Mysql en Foros del Web. SELECT detalle_presupuesto.cantidad, detalle_presupuesto.dias, detalle_presupuesto.precio_unit, detalle_presupuesto.precio_total_ps, detalle_presupuesto.Descrip, detalle_presupuesto.codigo_pto, detalle_presupuesto.codigo_osv, detalle_presupuesto.codigo_hab, detalle_presupuesto.codigo_eq, detalle_presupuesto.codigo_b, detalle_presupuesto.codigo_mt, detalle_presupuesto.codigo_alim, detalle_presupuesto.codigo_mtje, detalle_presupuesto.codigo_salon, presupuesto.fecha_emision, presupuesto.subtotal, presupuesto.iva, presupuesto.total_general_p, presupuesto.fecha_confirmacion, cliente.nombre_rs, cliente.telefono, cliente.fax, contactocli.contacto1, contactocli.cargo_dpto_c1, ...
  #1 (permalink)  
Antiguo 11/10/2012, 21:16
 
Fecha de Ingreso: agosto-2010
Mensajes: 19
Antigüedad: 13 años, 8 meses
Puntos: 0
Multiples fk












SELECT
detalle_presupuesto.cantidad,
detalle_presupuesto.dias,
detalle_presupuesto.precio_unit,
detalle_presupuesto.precio_total_ps,
detalle_presupuesto.Descrip,
detalle_presupuesto.codigo_pto,
detalle_presupuesto.codigo_osv,
detalle_presupuesto.codigo_hab,
detalle_presupuesto.codigo_eq,
detalle_presupuesto.codigo_b,
detalle_presupuesto.codigo_mt,
detalle_presupuesto.codigo_alim,
detalle_presupuesto.codigo_mtje,
detalle_presupuesto.codigo_salon,
presupuesto.fecha_emision,
presupuesto.subtotal,
presupuesto.iva,
presupuesto.total_general_p,
presupuesto.fecha_confirmacion,
cliente.nombre_rs,
cliente.telefono,
cliente.fax,
contactocli.contacto1,
contactocli.cargo_dpto_c1,
contactocli.telefono_c1,
detalle_evento.fecha_inic,
detalle_evento.fecha_fin,
detalle_evento.hora_e,
detalle_evento.n_personas,
evento.nombre_e,
montaje.nombre_mtje,
alimento.nombre_alim
FROM
detalle_presupuesto
INNER JOIN presupuesto ON detalle_presupuesto.codigo_pto = presupuesto.codigo_pto
INNER JOIN cliente ON presupuesto.codigo_cte = cliente.codigo_cte
INNER JOIN contactocli ON cliente.codigo_cte = contactocli.codigo_cte
INNER JOIN detalle_evento ON detalle_presupuesto.codigo_pto = detalle_evento.codigo_pto
INNER JOIN evento ON detalle_evento.codigo_evento = evento.codigo_evento
INNER JOIN salon ON detalle_presupuesto.codigo_salon = salon.codigo_salon
INNER JOIN alimento ON alimento.codigo_alim = detalle_presupuesto.codigo_alim
WHERE
detalle_presupuesto.codigo_pto = 32

en este query no me trae todos los item que necesito el problema es que detalle de presupuesto pasa por 3 partidas sera ese el problema ?





es correcto tener una tabla con diferentes fk?

Última edición por jonathanjd; 11/10/2012 a las 22:23
  #2 (permalink)  
Antiguo 12/10/2012, 04:06
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: Multiples fk

Es perfectamente posible tener N claves foráneas en una misma tabla. EIncluso te diré que es muy habitual.
Tu problema en la consulta puede ser debido a que para que te devuelva datos, debe haber registros relacionados con todas esas tablas al mismo tiempo, además de cumplir con el WHERE. Con sólo una relación que no ocurra (una que pueda ser opcional, no devolverá datos.
¿Has verificado eso?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/10/2012, 06:59
 
Fecha de Ingreso: agosto-2010
Mensajes: 19
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Multiples fk

SELECT
detalle_presupuesto.cantidad,
detalle_presupuesto.dias,
detalle_presupuesto.precio_unit,
detalle_presupuesto.precio_total_ps,
detalle_presupuesto.Descrip,
detalle_presupuesto.codigo_pto,
detalle_presupuesto.codigo_osv,
detalle_presupuesto.codigo_hab,
detalle_presupuesto.codigo_eq,
detalle_presupuesto.codigo_b,
detalle_presupuesto.codigo_mt,
detalle_presupuesto.codigo_alim,
detalle_presupuesto.codigo_mtje,
detalle_presupuesto.codigo_salon,
presupuesto.fecha_emision,
presupuesto.subtotal,
presupuesto.iva,
presupuesto.total_general_p,
presupuesto.fecha_confirmacion,
cliente.nombre_rs,
cliente.telefono,
cliente.fax,
contactocli.contacto1,
contactocli.cargo_dpto_c1,
contactocli.telefono_c1,
detalle_evento.fecha_inic,
detalle_evento.fecha_fin,
detalle_evento.hora_e,
detalle_evento.n_personas,
evento.nombre_e
FROM
detalle_presupuesto
INNER JOIN presupuesto ON detalle_presupuesto.codigo_pto = presupuesto.codigo_pto
INNER JOIN cliente ON presupuesto.codigo_cte = cliente.codigo_cte
INNER JOIN contactocli ON cliente.codigo_cte = contactocli.codigo_cte
INNER JOIN detalle_evento ON detalle_presupuesto.codigo_pto = detalle_evento.codigo_pto
INNER JOIN evento ON detalle_evento.codigo_evento = evento.codigo_evento
WHERE
detalle_presupuesto.codigo_pto = 32

En este Query me trae todo bien la cuestion es que necesito los datos de los nombre de dos tablas como salon y montaje.. la tabla salon la relaciono con la tabla de detalle de salon con cod_salon y de la montaje cod_mtje



Query con where para las 2 tablas

SELECT
detalle_presupuesto.cantidad,
detalle_presupuesto.dias,
detalle_presupuesto.precio_unit,
detalle_presupuesto.precio_total_ps,
detalle_presupuesto.Descrip,
presupuesto.fecha_emision,
presupuesto.subtotal,
presupuesto.iva,
presupuesto.total_general_p,
presupuesto.fecha_confirmacion,
cliente.nombre_rs,
cliente.telefono,
cliente.fax,
contactocli.contacto1,
contactocli.cargo_dpto_c1,
contactocli.telefono_c1,
detalle_evento.fecha_inic,
detalle_evento.fecha_fin,
detalle_evento.hora_e,
detalle_evento.n_personas,
evento.nombre_e,
salon.nombre_s_a,
montaje.nombre_mtje,
detalle_presupuesto.codigo_salon,
detalle_presupuesto.codigo_mtje,
detalle_presupuesto.codigo_pto,
detalle_presupuesto.codigo_osv,
detalle_presupuesto.codigo_hab,
detalle_presupuesto.codigo_eq,
detalle_presupuesto.codigo_b,
detalle_presupuesto.codigo_mt,
detalle_presupuesto.codigo_alim
FROM
detalle_presupuesto
INNER JOIN presupuesto ON detalle_presupuesto.codigo_pto = presupuesto.codigo_pto
INNER JOIN cliente ON presupuesto.codigo_cte = cliente.codigo_cte
INNER JOIN contactocli ON cliente.codigo_cte = contactocli.codigo_cte
INNER JOIN detalle_evento ON detalle_presupuesto.codigo_pto = detalle_evento.codigo_pto
INNER JOIN evento ON detalle_evento.codigo_evento = evento.codigo_evento
INNER JOIN salon ON detalle_presupuesto.codigo_salon = salon.codigo_salon
INNER JOIN montaje ON detalle_presupuesto.codigo_mtje = montaje.codigo_mtje
WHERE
detalle_presupuesto.codigo_pto = 32 AND
salon.codigo_salon = S1 AND
montaje.codigo_mtje = M1

igual no me trae nada



Aqui vemos que esos datos ya estan registrado



La unica solucion que le veo es que todas esa tablas tenga el mismo nombre de fk como cod_pto para cada esas tablas y no con nombre diferentes no se ayuden =(

Última edición por jonathanjd; 12/10/2012 a las 07:23
  #4 (permalink)  
Antiguo 12/10/2012, 07:33
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: Multiples fk

Consejos básicos para que podamos ver los problemas con claridad:
1) No postees las capturas de la pantalla integra, no se ven claramente, ni se entienden a simple vista. Recorta y postea solamente los segmentos de los datos.
2) Usa alias en las tablas, especialmente en consultas complejas. Facilitan ver los datos y las relaciones (por algo se inventaron).
3) Usa las etiquetas de BBCode que te provee la interfase de edición de mensajes en FDW. Ayuda a darle comprensividad a los códigos.

Respecto al problema, no estoy seguro de que hayas entendido bien lo que te dije...

¿Tienes claro que un INNER JOIN de múltiples tablas requiere que haya un registro que cumpla con las relaciones indicadas en todos los ON a = b al mismo tiempo, y que sólo devolverá aquellos registros donde todos los ON se cumplan?
La imagen que muestras parece mostrar que existen potencialmente relaciones que no se cumplen, es decir registros que no tienen valores en los campos que son FK, y por tanto no devolvería nada (más allá de lo que pongas o no en el WHERE).

Mi pregunta es la misma, porque no me la respondiste: ¿Verificaste que haya registros que cumplan con todos esos INNER JOIN? ¿Si o No?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/10/2012, 08:55
 
Fecha de Ingreso: agosto-2010
Mensajes: 19
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Multiples fk

si ya verifique
INNER JOIN salon ON detalle_presupuesto.codigo_salon = salon.codigo_salon
INNER JOIN montaje ON detalle_presupuesto.codigo_mtje = montaje.codigo_mtje

en la tabla detalles de presupuesto esta registrado.

aqui esta


En la tabla salon tengo un registro cod_salon = S1
y la tabla montaje igual cod_mtje = M1




y en la tabla detalle de presupuesto estan registrado esos valores deberia traerlo



el where que hago es que me traiga todos los detalles del presupuesto X y esta bien me trae todos los item la cuestion esta es que necesito los nombre de esos item y como pueden ver estan en otra tabla pero con fk cod_salon y el otro es cod_mtje



SELECT
detalle_presupuesto.cantidad,
detalle_presupuesto.dias,
detalle_presupuesto.precio_unit,
detalle_presupuesto.precio_total_ps,
detalle_presupuesto.Descrip,
detalle_presupuesto.codigo_pto,
detalle_presupuesto.codigo_osv,
detalle_presupuesto.codigo_hab,
detalle_presupuesto.codigo_eq,
detalle_presupuesto.codigo_b,
detalle_presupuesto.codigo_mt,
detalle_presupuesto.codigo_alim,
detalle_presupuesto.codigo_mtje,
detalle_presupuesto.codigo_salon,
presupuesto.fecha_emision,
presupuesto.subtotal,
presupuesto.iva,
presupuesto.total_general_p,
presupuesto.fecha_confirmacion,
cliente.nombre_rs,
cliente.telefono,
cliente.fax,
contactocli.contacto1,
contactocli.cargo_dpto_c1,
contactocli.telefono_c1,
detalle_evento.fecha_inic,
detalle_evento.fecha_fin,
detalle_evento.hora_e,
detalle_evento.n_personas,
evento.nombre_e,
montaje.nombre_mtje,
salon.nombre_s_a
FROM
detalle_presupuesto
INNER JOIN presupuesto ON detalle_presupuesto.codigo_pto = presupuesto.codigo_pto
INNER JOIN cliente ON presupuesto.codigo_cte = cliente.codigo_cte
INNER JOIN contactocli ON cliente.codigo_cte = contactocli.codigo_cte
INNER JOIN detalle_evento ON detalle_presupuesto.codigo_pto = detalle_evento.codigo_pto
INNER JOIN evento ON detalle_evento.codigo_evento = evento.codigo_evento
************************************************** *************** Aqui hago la relacion *************************
INNER JOIN montaje ON detalle_presupuesto.codigo_mtje = montaje.codigo_mtje
INNER JOIN salon ON detalle_presupuesto.codigo_salon = salon.codigo_salon
************************************************** *****************
WHERE
detalle_presupuesto.codigo_pto = 32

Última edición por jonathanjd; 12/10/2012 a las 09:06
  #6 (permalink)  
Antiguo 12/10/2012, 09:06
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: Multiples fk

El objetivo de usar los BBCODE es que la consulta sea más sencilla de analizar. Por ejemplo:
Código MySQL:
Ver original
  1.     DP.cantidad,
  2.     DP.dias,
  3.     DP.precio_unit,
  4.     DP.precio_total_ps,
  5.     DP.Descrip,
  6.     P.fecha_emision,
  7.     P.subtotal,
  8.     P.iva,
  9.     P.total_general_p,
  10.     P.fecha_confirmacion,
  11.     C.nombre_rs,
  12.     C.telefono,
  13.     C.fax,
  14.     CC.contacto1,
  15.     CC.cargo_dpto_c1,
  16.     CC.telefono_c1,
  17.     DE.fecha_inic,
  18.     DE.fecha_fin,
  19.     DE.hora_e,
  20.     DE.n_personas,
  21.     E.nombre_e,
  22.     S.nombre_s_a,
  23.     M.nombre_mtje,
  24.     DP.codigo_salon,
  25.     DP.codigo_mtje,
  26.     DP.codigo_pto,
  27.     DP.codigo_osv,
  28.     DP.codigo_hab,
  29.     DP.codigo_eq,
  30.     DP.codigo_b,
  31.     DP.codigo_mt,
  32.     DP.codigo_alim
  33.     detalle_presupuesto DP
  34.     INNER JOIN presupuesto P     ON DP.codigo_pto     = P.codigo_pto
  35.     INNER JOIN cliente C         ON P.codigo_cte     = C.codigo_cte
  36.     INNER JOIN contactocli CC     ON C.codigo_cte     = CC.codigo_cte
  37.     INNER JOIN detalle_evento DE     ON DP.codigo_pto     = DE.codigo_pto
  38.     INNER JOIN evento E         ON DE.codigo_evento     = E.codigo_evento
  39.     INNER JOIN salon S         ON DP.codigo_salon     = S.codigo_salon
  40.     INNER JOIN montaje M         ON DP.codigo_mtje     = M.codigo_mtje
  41.     DP.codigo_pto = 32
  42.     AND
  43.     S.codigo_salon = S1
  44.     AND
  45.     M.codigo_mtje = M1

Respecto al nombre de los campos usados de FK, la buena práctica dice que siempre tienen que tener el mismo nombre en todas las tablas donde aparezcan, y que debe ser el mismo que en su tabla de origen. Por eso jamás se deben usar nombres demasiado genéricos, como ID, CODIGO o cosas demasiado simples. Es mejor que sean específicos como ID_PRODUCTO, USER_ID, etc.
De ese modo no se prestan a confusiones y simplifican la escritura.

De todos modos, el problema de que no devuelva datos es siempre el mismo: No hay datos que cumplan las condiciones.
Descríbeme qué es lo que hace esa consulta. Es un listado de presupuesto, ¿de qué forma?, ¿vinculando qué datos?
Si lo explicas con un lenguaje coloquial (y sin imágenes), describiendo las reglas del negocio, posiblemente podamos ver por donde falla el tema.

Lo más probable es que las condiciones estén mal planteadas, relacionado las cosas de modo indebido y con el JOIN incorrecto.
__________________
¿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 12/10/2012, 09:12
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: Multiples fk

Cita:
En la tabla salon tengo un registro cod_salon = S1
y la tabla montaje igual cod_mtje = M1
Magnífico, pero en la tabla Presupuesto no veo que tengas un registro donde al mismo tiempo cod_salon = S1 y cod_mtje = M1. Si eso no se da... no devoverá registros...

¿Estás seguro de entender completamente cómo funciona un INNER JOIN?
No es que haya A, B, C, o D valores en diferentes registros. Es que deben estar en el mismo registro.
Es un sólo presupuesto, vinculado a todo eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 12/10/2012, 09:27
 
Fecha de Ingreso: agosto-2010
Mensajes: 19
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Multiples fk

Gracias Amigo por responder

Ok tengo que relacionar la tabla presupuesto con la tabla salon y montaje?

Por que la tabla salon y la de montaje solo estan en detalle de presupuesto no en la tabla de presupuesto


  #9 (permalink)  
Antiguo 12/10/2012, 09:42
 
Fecha de Ingreso: agosto-2010
Mensajes: 19
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Multiples fk



Yo necesito esos nombre de salon y de montaje =(

Y estan en esa tabla
  #10 (permalink)  
Antiguo 12/10/2012, 09:43
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: Multiples fk

No.

Volvamos atrás, y veamos una cuestión de diseño de sistemas...

Si un presupuesto tiene un detalle, y cada una de las instancias de ese detalle se refiere a un producto o servicio distinto, entonces debe haber una relación entre el detalle y una tabla que concentre el concepto de producto y servicio, entonces sólo se relacionará con esos elementos a través de otra entidad.
Alimentos, Salón, Evento, Equipos, etc., son conceptos de productos del servicio y como tal no deben tener una FK separada en la tabla detalle.
El diseño que estás haciendo es el de un reporte, y no de un detalle de servicio...
Por eso no obtienes resultados.

Para lograr el reporte que quieres, sin modificar el modelo de datos para hacerlo eficiente, tienes que invocar la tabla detalle tantas veces como items diferentes tienes con FK, relacionándolos con la tabla de presupuesto.
Cada invocación al detalle del presupuesto devolverá una única columna (salón, evento, etc.), y se relacionarán por el ID del presupuesto...

¿Se va entendiendo?

Precisamente porque esto se complica así, es que en realidad el modelo de datos debería tener otro diseño.

A como estás, vas a tener algunos buenos dolores de cabeza para crear las consultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 12/10/2012, 10:06
 
Fecha de Ingreso: agosto-2010
Mensajes: 19
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Multiples fk

gnzsoloyo Gracias fue de gran ayuda! tu Respuesta ya entendi! =) Saludos
  #12 (permalink)  
Antiguo 12/10/2012, 10:09
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: Multiples fk

OK.
Me alegro que te sirviera la aclaración.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, multiples, 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 10:22.