Ver Mensaje Individual
  #5 (permalink)  
Antiguo 22/08/2013, 08:34
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 9 meses
Puntos: 447
Respuesta: MySQL mostrar segun numero de coincidencias

Hola Marea2:

En primer lugar, desde mi punto de vista tienes un mal modelo de tablas... si tienes una relación n a m, como es el caso, ya que n profesores pueden impartir m materias, el modelo correcto es tener tres tablas, una para los profesores, otra para las materias y otra para relacionar ambas tablas... tal como lo tienes, nada te impide que tengas algo como esto:

Código MySQL:
Ver original
  1. +------+-----------+--------+--------+--------+--------+
  2. | id   | municipio | asign1 | asign2 | asign3 | asign4 |
  3. +------+-----------+--------+--------+--------+--------+
  4. |  100 |         3 | mate   | mate   | mate   | mate   |
  5. +------+-----------+--------+--------+--------+--------+

es decir, un maestro que la misma materia en todas los campos... y qué pasa si un maestro imparte sólo 1 materia... ¿dejas los otros campos como NULL? o qué pasa si imparte más de cuatro materias... ¿lo truncas solo a cuatro? si haces cualquiera de esto es un algo terrible, si fueras estudiante de diseño de bases de datos estarías reprobad@ y si fueras emplead@ de una empresa, serías despedid@.

Pero bueno, ese es un tema que no tiene nada que ver con lo que preguntas... la consulta la puedes hacer de muchas formas... por ejemplos puedes hacer una suma condicional, algo asi:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-----------+--------+--------+--------+--------+
  3. | id   | municipio | asign1 | asign2 | asign3 | asign4 |
  4. +------+-----------+--------+--------+--------+--------+
  5. |  100 |         3 | mate   | quim   | biol   | diss   |
  6. |  101 |         3 | quim   | lles   | diss   | mate   |
  7. |  102 |         3 | mate   | llca   | lica   | fisi   |
  8. |  103 |         3 | diss   | llca   | lica   | fisi   |
  9. |  104 |         4 | quim   | fisi   | diss   | biol   |
  10. +------+-----------+--------+--------+--------+--------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT
  14.     -> id, SUM(IF(asign1 IN ('mate', 'quim', 'biol'), 1, 0) +
  15.     ->         IF(asign2 IN ('mate', 'quim', 'biol'), 1, 0) +
  16.     ->         IF(asign3 IN ('mate', 'quim', 'biol'), 1, 0) +
  17.     ->         IF(asign4 IN ('mate', 'quim', 'biol'), 1, 0)
  18.     ->        ) total
  19.     -> FROM tabla
  20.     -> WHERE municipio = 3
  21.     -> GROUP BY id
  22.     -> HAVING total > 0
  23.     -> ORDER BY total DESC;
  24. +------+-------+
  25. | id   | total |
  26. +------+-------+
  27. |  100 |     3 |
  28. |  101 |     2 |
  29. |  102 |     1 |
  30. +------+-------+
  31. 3 rows in set (0.00 sec)

es decir, verificas si cada uno de los campos donde almacenas las materias tiene alguna de las materias y los vas contando, (suma 1 si existe la materia y 0 si no). con el WHERE filtras sólo los profesores para el municipio que quieres y con el HAVING filtras aquellos profesores que no imparten ninguna de las materias.

Dale un vistazo y espero que te sirva.

@jlct: es terriblemente ineficiente el usar tantos OR's... en su defecto utiliza IN, tiene el mismo efecto, pero la consulta es mas simple.

Saludos
Leo.