Ver Mensaje Individual
  #4 (permalink)  
Antiguo 29/09/2011, 10:00
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: restas y sumas en resultados de busquedas

Hola iPaNiiCx:

Si la consulta que pones en tu post es la que realmente necesitas, no hay necesidad de utilizar un UNION, pues la información la estás extrayendo de la misma tabla, bastaría con utilizar una sentencia IN en el WHERE para poder aplicar la comparación de múltiples materias:

Código MySQL:
Ver original
  1. mysql> SELECT profesor.nombre, curso.nombre
  2.     -> FROM profesor INNER JOIN curso ON profesor.noEmp = curso.noEmp
  3.     -> WHERE
  4.     -> curso.nombre IN ('Matemáticas', 'Inglés');
  5. +--------------------+-------------+
  6. | nombre             | nombre      |
  7. +--------------------+-------------+
  8. | Liliana Valenzuela | Matemáticas |
  9. | Erika Lopez        | Inglés      |
  10. +--------------------+-------------+
  11. 2 rows in set (0.00 sec)

Y algunas observaciones adicionales, no es recomendable que utilices JOIN's sin especificar la cláusula ON o USING, ya que se realiza un producto cartesiano, en tu caso estás filtrando la información en el WHERE, pero esta filtración se realiza después de hacer el producto cartesiano, lo que puede afectar mucho el rendimiento de tus consultas. Checa este ejemplo para ver la diferencia:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE profesor (noEmp INT, nombre VARCHAR(20));
  2. Query OK, 0 rows affected (0.12 sec)
  3.  
  4. mysql> INSERT INTO profesor VALUES (1, 'Liliana Valenzuela'),
  5.     -> (2, 'Erika Lopez'), (3, 'Fulano de tal');
  6. Query OK, 3 rows affected (0.03 sec)
  7. Records: 3  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> SELECT * FROM profesor;
  10. +-------+--------------------+
  11. | noEmp | nombre             |
  12. +-------+--------------------+
  13. |     1 | Liliana Valenzuela |
  14. |     2 | Erika Lopez        |
  15. |     3 | Fulano de tal      |
  16. +-------+--------------------+
  17. 3 rows in set (0.00 sec)
  18.  
  19. mysql> CREATE TABLE curso (noCurso INT, noEmp INT, nombre VARCHAR(20));
  20. Query OK, 0 rows affected (0.11 sec)
  21.  
  22. mysql> INSERT INTO curso VALUES (1, 1, 'Matemáticas'), (2, 2, 'Inglés');
  23. Query OK, 2 rows affected (0.03 sec)
  24. Records: 2  Duplicates: 0  Warnings: 0
  25.  
  26. mysql> SELECT * FROM curso;
  27. +---------+-------+-------------+
  28. | noCurso | noEmp | nombre      |
  29. +---------+-------+-------------+
  30. |       1 |     1 | Matemáticas |
  31. |       2 |     2 | Inglés      |
  32. +---------+-------+-------------+
  33. 2 rows in set (0.00 sec)
  34.  
  35. mysql> #Sin poner ON o USING se realiza un producto cartesiano antes del where
  36. mysql> SELECT * FROM profesor JOIN curso;
  37. +-------+--------------------+---------+-------+-------------+
  38. | noEmp | nombre             | noCurso | noEmp | nombre      |
  39. +-------+--------------------+---------+-------+-------------+
  40. |     1 | Liliana Valenzuela |       1 |     1 | Matemáticas |
  41. |     1 | Liliana Valenzuela |       2 |     2 | Inglés      |
  42. |     2 | Erika Lopez        |       1 |     1 | Matemáticas |
  43. |     2 | Erika Lopez        |       2 |     2 | Inglés      |
  44. |     3 | Fulano de tal      |       1 |     1 | Matemáticas |
  45. |     3 | Fulano de tal      |       2 |     2 | Inglés      |
  46. +-------+--------------------+---------+-------+-------------+
  47. 6 rows in set (0.00 sec)
  48.  
  49. mysql> SELECT * FROM profesor JOIN curso
  50.     -> WHERE profesor.noEmp = curso.noEmp;
  51. +-------+--------------------+---------+-------+-------------+
  52. | noEmp | nombre             | noCurso | noEmp | nombre      |
  53. +-------+--------------------+---------+-------+-------------+
  54. |     1 | Liliana Valenzuela |       1 |     1 | Matemáticas |
  55. |     2 | Erika Lopez        |       2 |     2 | Inglés      |
  56. +-------+--------------------+---------+-------+-------------+
  57. 2 rows in set (0.00 sec)
  58.  
  59. mysql> #Con ON o USING, la comparación se realiza directamente
  60. mysql> SELECT * FROM profesor JOIN curso ON profesor.noEmp = curso.noEmp;
  61. +-------+--------------------+---------+-------+-------------+
  62. | noEmp | nombre             | noCurso | noEmp | nombre      |
  63. +-------+--------------------+---------+-------+-------------+
  64. |     1 | Liliana Valenzuela |       1 |     1 | Matemáticas |
  65. |     2 | Erika Lopez        |       2 |     2 | Inglés      |
  66. +-------+--------------------+---------+-------+-------------+
  67. 2 rows in set (0.00 sec)

observa que aunque en las últimas dos consultas el resultado es el mismo, el primer caso no resulta óptimo. Con pocos registros no verías diferencias en los tiempos de respuesta, pero con tablas grandes verías que es mejor hacerlo con el ON.

Saludos
Leo.