Ver Mensaje Individual
  #5 (permalink)  
Antiguo 05/01/2012, 11:31
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Mejorar consulta

Hola Arsenal:

Si entendí correctamente, lo único que te falta es especifica en la consulta la empresa que estás consultando, tal como lo estás poniendo simplemente muestras los proveedores que no están asignados a ninguna empresa, para mostrar los proveedores que no están asignados a una empresa en específica sería más o menos así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE proveedores (id_proveedor INT, nombre VARCHAR(15));
  2. Query OK, 0 rows affected (0.16 sec)
  3.  
  4. mysql> INSERT INTO proveedores VALUES (1, 'proveedor 1'),
  5.     -> (2, 'proveedor 2'),(3, 'proveedor 3');
  6. Query OK, 3 rows affected (0.03 sec)
  7. Records: 3  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> SELECT * FROM proveedores;
  10. +--------------+-------------+
  11. | id_proveedor | nombre      |
  12. +--------------+-------------+
  13. |            1 | proveedor 1 |
  14. |            2 | proveedor 2 |
  15. |            3 | proveedor 3 |
  16. +--------------+-------------+
  17. 3 rows in set (0.00 sec)
  18.  
  19. mysql> CREATE TABLE empresa_proveedor (id INT, id_empresa INT, id_proveedor INT)
  20. ;
  21. Query OK, 0 rows affected (0.09 sec)
  22.  
  23. mysql> INSERT INTO empresa_proveedor VALUES (1, 1, 1);
  24. Query OK, 1 row affected (0.03 sec)
  25.  
  26. mysql> SELECT * FROM empresa_proveedor;
  27. +------+------------+--------------+
  28. | id   | id_empresa | id_proveedor |
  29. +------+------------+--------------+
  30. |    1 |          1 |            1 |
  31. +------+------------+--------------+
  32. 1 row in set (0.00 sec)
  33.  
  34.  
  35. mysql> #utilizando RIGHT JOIN para la empresa 1
  36. mysql> SELECT p.id_proveedor,p.nombre
  37.     -> FROM empresa_proveedor ep RIGHT JOIN
  38.     -> proveedores p
  39.     -> ON ep.id_proveedor = p.id_proveedor AND ep.id_empresa = 1
  40.     -> WHERE ep.id_proveedor IS NULL;
  41. +--------------+-------------+
  42. | id_proveedor | nombre      |
  43. +--------------+-------------+
  44. |            2 | proveedor 2 |
  45. |            3 | proveedor 3 |
  46. +--------------+-------------+
  47. 2 rows in set (0.00 sec)
  48.  
  49. mysql> #utilizando RIGHT JOIN para la empresa 2
  50. mysql> SELECT p.id_proveedor,p.nombre
  51.     -> FROM empresa_proveedor ep RIGHT JOIN
  52.     -> proveedores p
  53.     -> ON ep.id_proveedor = p.id_proveedor AND ep.id_empresa = 2
  54.     -> WHERE ep.id_proveedor IS NULL;
  55. +--------------+-------------+
  56. | id_proveedor | nombre      |
  57. +--------------+-------------+
  58. |            1 | proveedor 1 |
  59. |            2 | proveedor 2 |
  60. |            3 | proveedor 3 |
  61. +--------------+-------------+
  62. 3 rows in set (0.00 sec)

Observa que lo único que hice fue agregar en el ON del JOIN la condición para filtrar sólo los registros para la empresa que estás consultando.

También podrías haberlo hecho utilizando NOT EXIST y NOT IN así:

Código MySQL:
Ver original
  1. mysql> #Utilizando NOT EXISTS
  2. mysql> SELECT * FROM proveedores p WHERE NOT EXISTS(
  3.     -> SELECT id_proveedor FROM empresa_proveedor ep
  4.     -> WHERE ep.id_proveedor = p.id_proveedor AND ep.id_empresa = 2);
  5. +--------------+-------------+
  6. | id_proveedor | nombre      |
  7. +--------------+-------------+
  8. |            1 | proveedor 1 |
  9. |            2 | proveedor 2 |
  10. |            3 | proveedor 3 |
  11. +--------------+-------------+
  12. 3 rows in set (0.00 sec)
  13.  
  14. mysql> #Utilizando NOT IN
  15. mysql> SELECT * FROM proveedores p WHERE id_proveedor NOT IN
  16.     -> (SELECT id_proveedor
  17.     -> FROM empresa_proveedor ep WHERE ep.id_empresa = 2);
  18. +--------------+-------------+
  19. | id_proveedor | nombre      |
  20. +--------------+-------------+
  21. |            1 | proveedor 1 |
  22. |            2 | proveedor 2 |
  23. |            3 | proveedor 3 |
  24. +--------------+-------------+
  25. 3 rows in set (0.00 sec)

Saludos y espero que esto sea lo que necesitas.
Leo