Ver Mensaje Individual
  #6 (permalink)  
Antiguo 17/12/2013, 14:06
Avatar de gnzsoloyo
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, 5 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)