Ver Mensaje Individual
  #6 (permalink)  
Antiguo 01/10/2014, 06:03
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: Extraer registros con 2 campos dependientes

Bueno, volviendo al punto, cuando tienes N valores posibles para un campo o conjunto de campos, estos N valores nos indican que existe una relación 1:N entre la entidad base y otra que depende de ella. En tu caso lo que nos dice es que cada usuario o persona registrada en la tabla tiene como atributo idiomas que maneja, en cada uno de los cuales puede tener un único nivel de capacitacion.
Esto nos indica que hay al menos dos tablas (puede que más de dos) que faltan: idiomas_individuo, o algo así, donde se registra cada uno de los idiomas que la persona maneja con su respectiva categoría de conocimiento (B1, C2, etc.). Esa relación se define por medio de la FK que apunta a persona, y muy probablemente a otra tabla que nos indica la lista de idiomas registrados, cosa conveniente para evitar riesgos de inconsistencias de nombres si estos se ingresan manualmente.
A eso podría sumarse una de categorías o niveles, pero si la cantidad es inferior a 255, eso podría manejarse con un campo ENUM, sobre el que puedas buscar por nombre o indice. Es una decision de diseño.

Si tuviesemos esas dos tablas, tu consulta se reduciría a esto:

Código MySQL:
Ver original
  1. FROM personas P
  2.   INNER JOIN idioma_persona IP ON P.idpersona = IP.idpersona
  3.   INNER JOIN idioma I ON IP.id_idioma = I.id_idioma
  4. WHERE InombreIdioma = 'german'
  5.   AND IP.nivel = 'C2';
Incluso, si quieres todos los que manejan alemán en más de un nivel, podrías hacer:
Código MySQL:
Ver original
  1. FROM personas P
  2.   INNER JOIN idioma_persona IP ON P.idpersona = IP.idpersona
  3.   INNER JOIN idioma I ON IP.id_idioma = I.id_idioma
  4. WHERE InombreIdioma = 'german'
  5.   AND IP.nivel IN('C2', 'C1', 'B2');
con lo que no necesitas andar parseando el contenido del campo nivel, porque el valor contenido en cada registro de idioma en cada persona es único siempre.

Nota: LIKE es una cláusula que hay que manejar con cuidado porque tiende a generar resultados falsos en consultas cuando las cadenas de texto buscadas tienen menos de cinco caracteres.
Además, tampoco se lo debe usar con comodines en ambos lados porqu eeso genera FULL TABLE SCAN, lo que es la peor forma e consulta posible después del producto cartesiano.

Ver: Primera Forma Normal: Repeticion de grupos dentro de columnas
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 01/10/2014 a las 06:57