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

[SOLUCIONADO] problemas con inner

Estas en el tema de problemas con inner en el foro de Mysql en Foros del Web. hice este código, pero al parece algo esta fallando necesito de su ojo clínico para encontrar el error. espero puedo ayudarme gracias @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código ...
  #1 (permalink)  
Antiguo 17/12/2013, 12:31
 
Fecha de Ingreso: mayo-2006
Mensajes: 86
Antigüedad: 17 años, 10 meses
Puntos: 0
problemas con inner

hice este código, pero al parece algo esta fallando necesito de su ojo clínico para encontrar el error.
espero puedo ayudarme
gracias
Código MySQL:
Ver original
  1. SELECT * tablaC.`nivel`
  2.     FROM tablaA
  3.     INNER JOIN (tablaB LEFT JOIN tablaC ON tablaB.`puntosnivel` BETWEEN tablaC.`niv_inic` AND tablaC.`niv_fina` ) ON tablaA.`clienteid` = tablaB.`cli_id`;
[/CODE]

la tablaC es similar a esta



el objetivo es: elegir campos de tabla A, ademas elegir el campo nivel de la tabla C,
esto lo intente de esta forma
la tablaA tiene un campo clienteid y le hago un inner a la tabla B con su campo cli_id;
de esos datos cojo el campo puntosnivel de la tablaB y hago un between en la tablaC entre lso campos niv_inic y niv_fina;
para obtener el campo nivel de acuerdo a los puntos que tenga la cuenta en la tablaB
me sale con el primer rejistro de la tablaC
lero cuando los puntos son mayores al intervalo de este primer registro me vota valor en blanco.

Última edición por gnzsoloyo; 17/12/2013 a las 12:56
  #2 (permalink)  
Antiguo 17/12/2013, 13:00
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: problemas con inner

Código MySQL:
Ver original
  1.   tablaC.`nivel`
  2. FROM tablaA
  3.     INNER JOIN  tablaB
  4. LEFT JOIN tablaC ON tablaB.`puntosnivel` BETWEEN tablaC.`niv_inic` AND tablaC.`niv_fina`
  5. ON tablaA.`clienteid` = tablaB.`cli_id`;
Tu consulta está mal armada, y además tiene campos redundantes.
¿Cuál es la relación entre tablaA o TablaB con TablaC. Esa relación no está allí. Y antes que lo menciones, NO, el BETWEEN no es una forma de relacionar ese valor; y en todo caso eso sería una cláusula del WHERE y no del FROM.

Mira, tablaA y tablaB se relacionan así:
Código MySQL:
Ver original
  1. FROM tablaA INNER JOIN tablaB  ON tablaA.`clienteid` = tablaB.`cli_id`

Pero tablaC no tiene ninguna cláusula ON que indique cómo se vincula, y en ese caso no devolvería datos.

Si estás intentando "abstraer" el modelo, no lo hagas, Posteanos la consulta real, con la estructura de las tablas reales. BBDD es un ámbito muy concreto. Las abstracciones usualmente quitan información muy importante para resolver los casos.
__________________
¿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 17/12/2013, 13:24
 
Fecha de Ingreso: mayo-2006
Mensajes: 86
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: problemas con inner

muy bien, pero en ese caso como hago, para que con los datos obtenidos específicamente (puntosnivel) de tablaB hacer un between entre niv_inic y niv_fina de la tablaC
  #4 (permalink)  
Antiguo 17/12/2013, 13: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: 16 años, 4 meses
Puntos: 2658
Respuesta: problemas con inner

OK, Genial. pero aún así debería existir una relación entre la TablaB y la TablaC, si o si. ¿O acaso en esta tablaC tienes un único registro?
Porque la consulta que planteas (que debería estar dándote un error de sintaxis), busca aquellas ocurrencias de la TablaB que esté entre esos valores, de todos los registros de la TablaC.
Insisto, esa condición está MAL, porque debe existir una relación entre ambas, si o si.
¿Qué datos contiene la TablaC, y cómo se relacionan esos datos con la TablaB?

SI no entendemos tu escenario, difícilmente podemos darte una solución que sirva.
__________________
¿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 17/12/2013, 13:41
 
Fecha de Ingreso: mayo-2006
Mensajes: 86
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: problemas con inner

SELECT *, tablaC.`nivel`
FROM tablaA
INNER JOIN (tablaB
LEFT JOIN tablaC ON tablaB.`puntosnivel`BETWEEN tablaC.`niv_inic`AND tablaC.`niv_fina`)
ON tablaA.`clienteid` = tablaB.`cli_id`;


tablaC contiene estos registros

así tal como los ves relación definitiva entre tablas b y c no hay lo único que hice fue tomar el contenido del campo puntosnivel de la tablaB y hacer el between en C

lo rojo es la relación A y B
y lo azul es el dato obtenido de B para el between en C

como esplique arriba me sale en el primer registro de la tabla C
osea: cuando los puntos nivel están entre 1 y 50 incluyéndolos me arroja el valor, del campo (nivel) de la tabla C, pero cuando modifico el valor a mayor este entonces ya no me arroja nada, es como si solo hiciera una sola búsqueda y en el primer registro de C y lo demás lo obviara.

Última edición por rastafinis; 17/12/2013 a las 14:02 Razón: Muy mal etiquetado y resaltado. Usar HIGHLIGHT "MySQL", por favor.
  #6 (permalink)  
Antiguo 17/12/2013, 14: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: problemas con inner

Bueno, la tabla "TablaC" es lo que en base de datos se denomina "tabla paramétrica", y cuyo uso tiene una muy baja eficiencia. Sólo se usa cuando se pretende evitar normalizar la base en una forma adecuada, o cuando la representación real del negocio se complicaría innecesariamente.
Dependiendo de algunos factores, parece estar mal usada, pero vamos a suponer que no quieres modificarlo para hacerlo bien.

Hay varias formas para resolver tu consulta sin necesidad de tener que hacer las correcciones de estructura que deberían hacerse:

Una no muy eficiente:
Código MySQL:
Ver original
  1. SELECT A.*, B.*, IFNULL((SELECT C.`nivel` FROM tablaC C WHERE B.`puntosnivel` BETWEEN C.`niv_inic` AND C.`niv_fina`), 'Sin Nivel') Nivel
  2. FROM tablaA A INNER JOIN  tablaB B ON A.`clienteid` = B.`cli_id`;

Si todos los miembros tienen al menos un punto:
Código MySQL:
Ver original
  1. SELECT A.*, B2.*
  2. FROM tablaA A
  3.     INNER JOIN  
  4.     (SELECT B.*, IFNULL(C.Nivel, 'Sin Nivel') Nivel
  5.     FROM tablaB B JOIN TablaC C
  6.     WHERE B.`puntosnivel` BETWEEN C.`niv_inic` AND C.`niv_fina`) B2
  7.         ON A.`clienteid` = B.`cli_id`;

Si al menos uno de los miembros no tienen al menos un puntos:
Código MySQL:
Ver original
  1. SELECT A.*, B2.*
  2. FROM tablaA A
  3.     INNER JOIN  
  4.     (SELECT B.*, IFNULL(C.Nivel, 'Sin Nivel') Nivel
  5.     FROM tablaB B LEFT JOIN TablaC C
  6.     WHERE (B.`puntosnivel` BETWEEN C.`niv_inic` AND C.`niv_fina`)
  7.          OR C.`niv_fina` IS NULL) B2
  8.         ON A.`clienteid` = B.`cli_id`;
¿Cuál sería la forma correcta?

Que tuvieses un campo id_nivel en la tablaB que lo relacione con la TablaC, un trigger (disparador) que ante cualquier UPDATE de la base calculara el nivel e insertar el id_nivel de la tabla en base a los puntos, y que además tuvieses un nivel para los sin calificación (de cero a cero)
Entonces todo se reduciría a esto:
Código MySQL:
Ver original
  1. SELECT A.*, B.*, C.`nivel`
  2. FROM tablaA A
  3.     INNER JOIN  tablaB B ON A.`clienteid` = B.`cli_id`;
  4.     INNER JOIN tablaC C ON B.id_nivel = C.id_nivel
__________________
¿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 17/12/2013, 14:29
 
Fecha de Ingreso: mayo-2006
Mensajes: 86
Antigüedad: 17 años, 10 meses
Puntos: 0
Respuesta: problemas con inner

Gracias, por tu valentísimo tiempo, en verdad fue muy importante. y es de valor incalculable, me temo que agregare dicho campo en mi tercera tabla para hacer el inner mas limpio
gracias

editado a las 23:27 hora perú,
bueno lo intente tantas veces como pude y lo logre era simple, y si estaba en lo correcto; si se podía hacer la relación con el between ya que cumple como una relación

la sintaxis es esta
Código MySQL:
Ver original
  1. select   a.*, c.niv_nimg
  2. from TablaA a
  3. JOIN TablaB b on a.art_clie = b.cli_id
  4. LEFT JOIN TablaC c on b.puntosnivel BETWEEN c.niv_inic AND c.niv_fina;

pero ojo los campos a trabajar deben ser numéricos, y mi error fue trabajar con cadenas (varchar), entonces después de revisarlo decidí trabajarlos con (int) y salio. se soluciono.
así que dejo el código para un futuro similar y encuentren la solución.

Última edición por rastafinis; 17/12/2013 a las 22:33 Razón: se encontrón la solucion

Etiquetas: campo, join, registro, select, tabla
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.